summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex750
1 files changed, 660 insertions, 90 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex
index 5c248ad9f56..3528771b1a8 100644
--- a/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex
+++ b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex
@@ -1,4 +1,5 @@
% Copyright 2009 by Till Tantau
+% Copyright 2019 by Jonathan P. Spratte
%
% This file may be distributed and/or modified
%
@@ -11,101 +12,670 @@
%
% This file defines commands for defining a letter-by-letter parser
-% based on a dfa.
+% based on a dfa. The idea is inspired by the pgf module parser, but extends it
+% and eventually replaced it.
%
+% options
+\long\def\pgfparserset#1%
+ {%
+ \pgfset{/pgfparser/.cd,#1}%
+ }
+\pgfparserset
+ {%
+ ,silent/.is if=\pgfparser@ifname{every parser silent}%
+ ,status/.is if=\pgfparser@ifname{pgfparser status}%
+ }
+% logic helpers
+\long\def\pgfparser@fi@Bn\fi#1{\fi}
+\long\def\pgfparser@fi@Bg\fi#1#2{\fi}
+\long\def\pgfparser@fi@BTb\fi#1#2#3{\fi#2}
+\long\def\pgfparser@fi@BTc\fi#1#2#3{\fi#3}
+% opt arg parsing
+\long\def\pgfparserifmark#1%
+ {%
+ \ifx\pgfparser@mark#1%
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@oarg#1%
+ {%
+ \pgfutil@ifnextchar[{\pgfparser@oarg@oarg@{#1}}{#1{\pgfparser@mark}}%
+ }
+\long\def\pgfparser@oarg@oarg@#1[#2]%
+ {%
+ #1{#2}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@Oarg#1#2%
+ {%
+ \pgfutil@ifnextchar[{\pgfparser@oarg@oarg@{#2}}{#2{#1}}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@darg#1#2#3%
+ {%
+ \long\def\pgfparser@oarg@darg@##1#1##2#2{##1{##2}}%
+ \pgfutil@ifnextchar#1{\pgfparser@oarg@darg@{#3}}{#3{\pgfparser@mark}}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@Darg#1#2#3#4%
+ {%
+ \long\def\pgfparser@oarg@darg@##1#1##2#2{##1{##2}}%
+ \pgfutil@ifnextchar#1{\pgfparser@oarg@darg@{#4}}{#4{#3}}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@targ@#1%
+ {%
+ \def\pgfparser@oarg@targ@next{#1}%
+ \afterassignment\pgfparser@oarg@targ@next
+ \let\pgfparser@ignored@token=%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@targ#1#2%
+ {%
+ \pgfutil@ifnextchar#1%
+ {\pgfparser@oarg@targ@{#2{\pgfparser@mark}}}{#2{\pgfparser@stop}}%
+ }
-% Parse the following text
-%
-% #1 = parser
-%
-% Description:
-%
-% This command starts the parser #1 in the initial state "initial". It
-% will parse the following text, stopping when the state "final" has
-% been reached.
-
-\def\pgfparserparse#1{%
- \def\pgf@parser{#1}%
- \def\pgf@parser@state{initial}%
- \pgf@parser@parse%
-}
-\def\pgf@parser@parse{%
- \futurelet\pgf@parser@symbol\pgf@parser@cont%
-}
-\def\pgf@parser@cont{%
- % Ok, defined?
- \expandafter\let\expandafter\pgf@parser@action%
- \csname pgf@parser@a@\pgf@parser @\pgf@parser@state @\meaning\pgf@parser@symbol\endcsname%
- \ifx\pgf@parser@action\relax%
- \expandafter\let\expandafter\pgf@parser@action%
- \csname pgf@parser@a@\pgf@parser @all@\meaning\pgf@parser@symbol\endcsname%
- \ifx\pgf@parser@action\relax%
- \pgferror{Unexpected character
- '\meaning\pgf@parser@symbol' in parser '\pgf@parser' in state
- '\pgf@parser@state'}%
- \fi%
- \fi%
- \pgf@parser@action%
- \ifx\pgf@parser@symbol\pgfutil@sptoken%
- \expandafter\pgf@parser@rid@space%
- \else%
- \expandafter\pgf@parser@rid@other%
- \fi%
-}
-
-\def\pgf@parser@ridded{%
- \ifx\pgf@parser@state\pgf@parser@final@text%
- % done
- \else%
- \expandafter\pgf@parser@parse%
- \fi%
-}
-
-\def\pgf@parser@final@text{final}
-
-{%
- \def\:{\pgf@parser@rid@space} \expandafter\gdef\: {\futurelet\pgf@parser@ignore\pgf@parser@ridded}
- \gdef\pgf@parser@rid@other{\afterassignment\pgf@parser@ridded\let\pgf@parser@ignore=}
-}
-
-
-
-% Switches the state
-%
-% #1 = new state
-%
-% Description:
-%
-% This command can be used inside a state action to switch to a
-% different state.
-
-\def\pgfparserswitch#1{\def\pgf@parser@state{#1}}
-
-
-
-
-% Defines an action to be taken in a state for some symbol
-%
-% #1 = parser
-% #2 = state
-% #3 = symbol text (result of saying \meaning on the symbol)
-% #4 = action
-%
-% Description:
-%
-% When the parser encounters #3 while being in state #2, then code #4
-% is executed.
-%
-% When #2 is set to the special text "all", then the symbol is handled
-% in all states by #4, except when a state defines something special
-% for this symbol
-
-\def\pgfparserdef#1#2#3#4{%
- \expandafter\def\csname pgf@parser@a@#1@#2@#3\endcsname{#4}
-}
+% status messages
+\pgfutil@protected\def\pgfparser@msg#1%
+ {%
+ \immediate\write0{(pgfparser) #1}%
+ }
+\pgfutil@protected\def\pgfparser@status@start#1%
+ {%
+ \pgfparser@if{pgfparser status}{\pgfparser@msg{parser '#1' started}}{}%
+ }
+\pgfutil@protected\def\pgfparser@status@state#1%
+ {%
+ \pgfparser@if{pgfparser status}
+ {\pgfparser@msg{|= switched to state '#1'}}
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule
+ {%
+ \pgfparser@if{pgfparser status}
+ {\pgfparser@msg{| \space|= rule '\meaning\pgfparsertoken' executed}}
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule@all
+ {%
+ \pgfparser@if{pgfparser status}
+ {%
+ \pgfparser@msg
+ {| \space|= (all) rule '\meaning\pgfparsertoken' executed}%
+ }
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule@undefined
+ {%
+ \pgfparser@if{pgfparser status}
+ {%
+ \pgfparser@msg
+ {| \space|= unknown for '\meaning\pgfparsertoken' executed}%
+ }
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule@undefined@all
+ {%
+ \pgfparser@if{pgfparser status}
+ {%
+ \pgfparser@msg
+ {| \space|= (all) unknown for '\meaning\pgfparsertoken' executed}%
+ }
+ {}%
+ }
+
+% macros for string comparison
+\begingroup
+\lccode`\P=`\P \lccode`\G=`\G \lccode`\F=`\F
+\lccode`\:=`\X \lccode`\;=`\r \lccode`\A=`\-
+\lowercase
+ {%
+ \endgroup
+ \def\pgfparser@mark{APGFparse;:mark-}%
+ \def\pgfparser@stop{APGFparse;:stop-}%
+ }%
+\def\pgfparser@final{final}
+\def\pgfparser@noarg{noarg}
+\def\pgfparser@blankspace{blank space}
+
+% counters
+\newcount\pgfparserdef@arg@count
+
+% shortcuts for special names
+\def\pgfparser@name#1%
+ {%
+ pgfparser #1%
+ }
+\def\pgfparser@rule#1%
+ {%
+ \pgfparser@current\space #1\space \meaning\pgfparsertoken
+ }
+\def\pgfparser@type#1%
+ {%
+ \pgfparser@rule{#1} type%
+ }
+\def\pgfparser@code#1%
+ {%
+ \pgfparser@rule{#1} code%
+ }
+\def\pgfparser@undefined#1%
+ {%
+ \pgfparser@current\space #1\space unknown%
+ }
+\def\pgfparser@ifname#1%
+ {%
+ pgfparserconditional #1%
+ }
+
+% conditionals
+\def\pgfparser@if#1%
+ {%
+ \pgfutil@ifundefined{if\pgfparser@ifname{#1}}
+ {%
+ \pgferror{Undefined conditional '#1'. Falling back to false}%
+ \iffalse
+ }
+ {\csname if\pgfparser@ifname{#1}\endcsname}%
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ }
+\def\pgfparser@newif#1%
+ {%
+ \csname newif\expandafter\endcsname
+ \csname if\pgfparser@ifname{#1}\endcsname
+ }
+\pgfparser@newif{every parser silent}
+\pgfparser@newif{pgfparserdef abort}
+\pgfparser@newif{pgfparser status}
+
+% pgfparserdef
+\pgfutil@protected\def\pgfparserdef#1#2%
+ {%
+ \def\pgfparserdef@twoargs{{#1}{#2}}%
+ \pgfparserdef@a
+ }
+\pgfutil@protected\def\pgfparserdef@a
+ {%
+ \futurelet\pgfparserdef@arg\pgfparserdef@b
+ }
+\def\pgfparserdef@b
+ {%
+ \ifx\pgfparserdef@arg\pgfutil@sptoken
+ % will also gobble the \pgfparserdef@c after \fi
+ \pgfparserdef@gobble@space
+ \fi
+ \pgfparserdef@c
+ }
+\pgfutil@protected\def\pgfparserdef@gobble@space\fi#1%
+ {%
+ \fi
+ \afterassignment\pgfparserdef@a
+ \let\pgfparser@ignored@token= % space after = to get spaces, too
+ }
+\pgfutil@protected\def\pgfparserdef@c#1%
+ {%
+ \ifx\pgfparserdef@arg\bgroup
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \def\pgfparserdef@arg{#1}%
+ \ifx\pgfparser@blankspace\pgfparserdef@arg
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {\expandafter\pgfparserdef@d\pgfparserdef@twoargs{blank space \space}}
+ {\expandafter\pgfparserdef@d\pgfparserdef@twoargs{#1}}%
+ }
+ {%
+ \expandafter\pgfparserdef@d\pgfparserdef@twoargs
+ {\meaning\pgfparserdef@arg}%
+ }%
+ }
+\long\def\pgfparserdef@d#1#2#3%
+ {%
+ \pgfparser@oarg@Oarg{}{\pgfparserdef@e{#1}{#2}{#3}}%
+ }
+\pgfutil@protected\long\def\pgfparserdef@e#1#2#3#4#5%
+ {%
+ \pgfparser@initiate@parser{#1}%
+ \csname\pgfparser@ifname{pgfparserdef abort}false\endcsname
+ % check how many arguments are used, also parses whether the argument string
+ % is valid
+ \pgfparserdef@arg@count=0
+ \pgfparserdef@argcount#4\pgfparser@mark
+ \ifnum\pgfparserdef@arg@count>9
+ \pgferror
+ {%
+ Too many arguments for parser rule. A maximum of 9 parameters is
+ supported.%
+ }%
+ \csname\pgfparser@ifname{pgfparserdef abort}true\endcsname
+ \fi
+ % define what the code does
+ \pgfparser@if{pgfparserdef abort}{}
+ {%
+ % use a macro as flag that there is a rule for the specified state and
+ % hold information how to parse it
+ \ifnum\pgfparserdef@arg@count=0
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 type}{noarg}%
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 code}%
+ {#5\pgfparser@getnexttoken}%
+ \else
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 type}{#4}%
+ \expandafter\pgfparserdef@argstring@def\the\pgfparserdef@arg@count
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 code\expandafter}%
+ \pgfparserdef@argstring##1##2##3##4##5##6##7##8##9%
+ {#5\pgfparser@getnexttoken}%
+ \fi
+ }%
+ }
+\def\pgfparserdef@argstring@def#1%
+ {%
+ \def\pgfparserdef@argstring##1#1##2##{##1#1}%
+ }
+\def\pgfparserdef@argcount#1%
+ {%
+ \ifx\pgfparser@mark#1%
+ \pgfparser@fi@Bg
+ \fi
+ \pgfutil@firstofone
+ {%
+ \pgfutil@IfUndefined{pgfparserdef@argcount@#1}
+ {%
+ \pgferror{Unknown argument type '#1'. Aborting rule definition}%
+ \pgfparserdef@argcount@abort
+ }
+ {\csname pgfparserdef@argcount@#1\endcsname}%
+ }%
+ }
+\pgfutil@protected\long\def\pgfparserdef@argcount@abort#1\pgfparser@mark
+ {%
+ \csname\pgfparser@ifname{pgfparserdef abort}true\endcsname
+ }
+\def\pgfparserdef@argcount@m
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+\let\pgfparserdef@argcount@o\pgfparserdef@argcount@m
+\def\pgfparserdef@argcount@O#1%
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+\let\pgfparserdef@argcount@r\pgfparserdef@argcount@O
+\let\pgfparserdef@argcount@t\pgfparserdef@argcount@O
+\def\pgfparserdef@argcount@d#1#2%
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+\def\pgfparserdef@argcount@D#1#2#3%
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+
+\pgfutil@protected\def\pgfparser@initiate@parser#1%
+ {%
+ % if that is the first rule for the parser
+ \pgfutil@IfUndefined{if\pgfparser@ifname{#1 silent}}%
+ {%
+ % define space to be a no-op
+ \pgfutil@namedef
+ {\pgfparser@name{#1} all blank space \space\space type}{noarg}%
+ \pgfutil@namedef
+ {\pgfparser@name{#1} all blank space \space\space code}%
+ {\pgfparser@getnexttoken}%
+ % define a new conditional whether the parser silently ignores unknown
+ % tokens
+ \pgfparser@newif{#1 silent}%
+ \pgfparserset
+ {%
+ #1/silent/.is if=\pgfparser@ifname{#1 silent}%
+ }%
+ }
+ {}%
+ }
+
+% pgfparserlet
+\pgfutil@protected\def\pgfparserlet#1#2%
+ {%
+ \def\pgfparserlet@parser@a{#1}%
+ \def\pgfparserlet@state@a{#2}%
+ \pgfparserlet@a
+ }
+\pgfutil@protected\def\pgfparserlet@a
+ {%
+ \futurelet\pgfparserlet@arga\pgfparserlet@b
+ }
+\def\pgfparserlet@b
+ {%
+ \ifx\pgfparserlet@arga\pgfutil@sptoken
+ % will also gobble the \pgfparserlet@c after \fi
+ \pgfparserlet@gobble@space\pgfparserlet@a
+ \fi
+ \pgfparserlet@c
+ }
+\pgfutil@protected\def\pgfparserlet@gobble@space#1\fi#2%
+ {%
+ \fi
+ \afterassignment#1%
+ \let\pgfparser@ignored@token= % space after = to get spaces, too
+ }
+\pgfutil@protected\def\pgfparserlet@c#1%
+ {%
+ \ifx\pgfparserlet@arga\bgroup
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \def\pgfparserlet@arga{#1}%
+ \ifx\pgfparser@blankspace\pgfparserlet@arga
+ \def\pgfparserlet@arga{blank space \space}%
+ \fi
+ }
+ {\edef\pgfparserlet@arga{\meaning\pgfparserlet@arga}}%
+ \pgfparser@oarg@oarg\pgfparserlet@d
+ }
+\pgfutil@protected\def\pgfparserlet@d#1%
+ {%
+ \pgfparserifmark{#1}
+ {%
+ \let\pgfparserlet@parser@b\pgfparserlet@parser@a
+ \let\pgfparserlet@state@b\pgfparserlet@state@a
+ \pgfparserlet@f
+ }
+ {\pgfparser@oarg@oarg{\pgfparserlet@e{#1}}}%
+ }
+\pgfutil@protected\def\pgfparserlet@e#1#2%
+ {%
+ \pgfparserifmark{#2}
+ {%
+ \let\pgfparserlet@parser@b\pgfparserlet@parser@a
+ \def\pgfparserlet@state@b{#1}%
+ }
+ {%
+ \def\pgfparserlet@parser@b{#1}%
+ \def\pgfparserlet@state@b{#2}%
+ }
+ \pgfparserlet@f
+ }
+\pgfutil@protected\def\pgfparserlet@f
+ {%
+ \futurelet\pgfparserlet@argb\pgfparserlet@g
+ }
+\def\pgfparserlet@g
+ {%
+ \ifx\pgfparserlet@argb\pgfutil@sptoken
+ % will also gobble the \pgfparserlet@c after \fi
+ \pgfparserlet@gobble@space\pgfparserlet@f
+ \fi
+ \pgfparserlet@h
+ }
+\pgfutil@protected\def\pgfparserlet@h#1%
+ {%
+ \ifx\pgfparserlet@argb\bgroup
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \def\pgfparserlet@argb{#1}%
+ \ifx\pgfparser@blankspace\pgfparserlet@argb
+ \def\pgfparserlet@argb{blank space \space}%
+ \fi
+ }
+ {\edef\pgfparserlet@argb{\meaning\pgfparserlet@argb}}%
+ \pgfparserlet@i
+ \pgfparserlet@parser@a
+ \pgfparserlet@state@a
+ \pgfparserlet@arga
+ \pgfparserlet@parser@b
+ \pgfparserlet@state@b
+ \pgfparserlet@argb
+ }
+\def\pgfparserlet@i#1#2#3#4#5#6%
+ {%
+ \pgfutil@IfUndefined{\pgfparser@name{#4} #5 #6 type}
+ {%
+ \pgferror
+ {%
+ There is no rule defined for parser '#4' in state '#5' for '#6'.
+ Aborting \string\pgfparserlet
+ }%
+ }
+ {%
+ \pgfparser@initiate@parser{#1}%
+ \pgfparserlet@let{#1}{#2}{#3}{#4}{#5}{#6}{type}%
+ \pgfparserlet@let{#1}{#2}{#3}{#4}{#5}{#6}{code}%
+ }%
+ }
+\def\pgfparserlet@let#1#2#3#4#5#6#7%
+ {%
+ \expandafter\let\csname\pgfparser@name{#1} #2 #3 #7\expandafter\endcsname
+ \csname\pgfparser@name{#4} #5 #6 #7\endcsname
+ }
+
+\pgfutil@protected\long\def\pgfparserdefunknown#1#2#3%
+ {%
+ \pgfparser@initiate@parser{#1}%
+ \pgfutil@namedef{\pgfparser@name{#1} #2 unknown}{#3}%
+ }
+\pgfutil@protected\long\def\pgfparserdeffinal#1#2%
+ {%
+ \pgfutil@namedef{\pgfparser@name{#1} final action}{#2}%
+ }
+\pgfutil@protected\def\pgfparserswitch#1%
+ {%
+ \pgfparser@status@state{#1}%
+ \def\pgfparserstate{#1}%
+ }
+\pgfutil@protected\def\pgfparserparse#1%
+ {%
+ \pgfutil@IfUndefined{if\pgfparser@ifname{#1 silent}}
+ {\pgferror{No parser named '#1' defined}}
+ {%
+ \edef\pgfparser@current{\pgfparser@name{#1}}%
+ \def\pgfparser@usersname{#1}%
+ \pgfparser@status@start{#1}%
+ \pgfparserswitch{initial}%
+ \pgfparser@getnexttoken
+ }%
+ }
+% get next token
+\pgfutil@protected\def\pgfparser@getnexttoken
+ {%
+ \ifx\pgfparserstate\pgfparser@final
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \pgfutil@IfUndefined{\pgfparser@current\space final action}
+ {}
+ {\csname \pgfparser@current\space final action\endcsname}%
+ }
+ {%
+ \futurelet\pgfparsertoken\pgfparser@getnexttoken@a
+ }%
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@a
+ {%
+ \pgfparser@getnexttoken@iftokengobble\bgroup\bgroup
+ {%
+ \pgfparser@getnexttoken@iftokengobble\egroup\egroup
+ {%
+ \pgfparser@getnexttoken@iftokengobble\pgfutil@sptoken{ }%
+ {\pgfparser@getnexttoken@defchar}%
+ }%
+ }%
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@iftokengobble#1#2%
+ {%
+ \ifx\pgfparsertoken#1%
+ \def\pgfparserletter{#2}%
+ \pgfparser@getnexttoken@gobble
+ \fi
+ \pgfutil@firstofone
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@gobble\fi#1#2%
+ {%
+ \fi
+ \afterassignment\pgfparser@getnexttoken@b
+ \let\pgfparser@ignored@token= % gobble should gobble a space
+ }
+\pgfutil@protected\long\def\pgfparser@getnexttoken@defchar#1%
+ {%
+ \def\pgfparserletter{#1}%
+ \pgfparser@getnexttoken@b
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@b
+ {%
+ \pgfutil@IfUndefined{\pgfparser@type{\pgfparserstate}}
+ {%
+ \pgfutil@IfUndefined{\pgfparser@type{all}}
+ {%
+ \pgfparser@if{every parser silent}{}
+ {%
+ \pgfparser@if{\pgfparser@usersname\space silent}{}
+ {%
+ \pgferror
+ {%
+ No rule for parser '\pgfparser@usersname' in state
+ '\pgfparserstate' for '\meaning\pgfparsertoken'.
+ Ignoring token%
+ }%
+ }%
+ }%
+ \pgfutil@IfUndefined{\pgfparser@undefined{\pgfparserstate}}
+ {%
+ \pgfutil@IfUndefined{\pgfparser@undefined{all}}
+ {}
+ {%
+ \pgfparser@status@rule@undefined@all
+ \csname\pgfparser@undefined{all}\endcsname
+ }%
+ }
+ {%
+ \pgfparser@status@rule@undefined
+ \csname\pgfparser@undefined{\pgfparserstate}\endcsname
+ }%
+ \pgfparser@getnexttoken
+ }
+ {%
+ \pgfparser@status@rule@all
+ \pgfparser@handle{all}%
+ }%
+ }
+ {%
+ \pgfparser@status@rule
+ \pgfparser@handle{\pgfparserstate}%
+ }%
+ }
+
+% handle arguments
+\pgfutil@protected\def\pgfparser@handle#1%
+ {%
+ \expandafter\ifx\csname\pgfparser@type{#1}\endcsname\pgfparser@noarg
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {\csname\pgfparser@code{#1}\endcsname}
+ {\pgfparser@handle@args{#1}}%
+ }
+\pgfutil@protected\def\pgfparser@handle@args#1%
+ {%
+ \def\pgfparser@stateorall{#1}%
+ \expandafter\expandafter\expandafter\pgfparser@handle@args@a
+ \csname\pgfparser@type{#1}\endcsname\pgfparser@mark\pgfparser@stop
+ }
+\def\pgfparser@handle@args@a
+ {%
+ \pgfparser@handle@args@b{}%
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@b#1#2#3\pgfparser@stop
+ {%
+ \pgfparserifmark{#2}
+ {\csname\pgfparser@code{\pgfparser@stateorall}\endcsname#1}
+ {%
+ \pgfutil@IfUndefined{pgfparser@handle@args@#2}
+ {\pgferror{Unknown argument type '#2'}}
+ {\csname pgfparser@handle@args@#2\endcsname{#1}{#3}}%
+ }%
+ }
+\long\def\pgfparser@handle@args@c#1#2%
+ {%
+ \pgfparserifmark{#2}
+ {\csname\pgfparser@code{\pgfparser@stateorall}\endcsname#1}
+ {\pgfparser@handle@args@b{#1}#2\pgfparser@stop}%
+ }
+\long\def\pgfparser@handle@args@m#1#2#3%
+ {%
+ \pgfparser@handle@args@c{#1{#3}}{#2}%
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@o#1#2%
+ {%
+ \pgfparser@oarg@oarg{\pgfparser@handle@args@m{#1}{#2}}%
+ }
+\long\def\pgfparser@handle@args@O#1#2%
+ {%
+ \pgfparser@handle@args@O@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@O@#1#2#3\pgfparser@stop
+ {%
+ \pgfparser@oarg@Oarg{#2}{\pgfparser@handle@args@m{#1}{#3}}%
+ }
+\long\def\pgfparser@handle@args@d#1#2%
+ {%
+ \pgfparser@handle@args@d@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@d@#1#2#3#4\pgfparser@stop
+ {%
+ \pgfparser@oarg@darg{#2}{#3}{\pgfparser@handle@args@m{#1}{#4}}%
+ }
+\long\def\pgfparser@handle@args@D#1#2%
+ {%
+ \pgfparser@handle@args@D@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@D@#1#2#3#4#5\pgfparser@stop
+ {%
+ \pgfparser@oarg@Darg{#2}{#3}{#4}{\pgfparser@handle@args@m{#1}{#5}}%
+ }
+\long\def\pgfparser@handle@args@r#1#2%
+ {%
+ \pgfparser@handle@args@r@a{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@r@a#1#2#3\pgfparser@stop
+ {%
+ \def\pgfparser@handle@args@r@b##1#2%
+ {\pgfparser@handle@args@c{#1{##1}}{#3}}%
+ \pgfparser@handle@args@r@b
+ }
+\long\def\pgfparser@handle@args@t#1#2%
+ {%
+ \pgfparser@handle@args@t@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@t@#1#2#3\pgfparser@stop
+ {%
+ \pgfparser@oarg@targ{#2}{\pgfparser@handle@args@m{#1}{#3}}%
+ }
+\pgfutil@protected\long\def\pgfparserreinsert#1%
+ {%
+ \ifx\pgfparser@getnexttoken#1%
+ \pgfparser@fi@BTb
+ \fi
+ \@secondoftwo
+ {\expandafter\pgfparser@getnexttoken\pgfparserletter}
+ {%
+ \pgferror
+ {%
+ Misuse of \string\pgfparserreinsert\space detected. You should only
+ use it at the the end of an action code%
+ }%
+ #1%
+ }%
+ }
\endinput