diff options
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.tex | 111 |
1 files changed, 111 insertions, 0 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 new file mode 100644 index 00000000000..ed13b25324c --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleparser.code.tex @@ -0,0 +1,111 @@ +% Copyright 2009 by Till Tantau +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Public License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + +\ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/modules/pgfmoduleparser.code.tex,v 1.1 2009/01/12 12:56:09 tantau Exp $ + +% +% This file defines commands for defining a letter-by-letter parser +% based on a dfa. +% + + + + +% 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% + \PackageError{pgfparse}{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} +} + + +\endinput |