% Copyright 2012-2015, Alexander Shibakov % This file is part of SPLinT % % SPLinT is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % SPLinT is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with SPLinT. If not, see . % prototypes of all the macros produced by the parser % we will follow the convention: 12string is a string of category 12 characters and spaces, tex_string: a string % of TeX tokens; sptr is a pointer to the stash stream, fptr is a pointer to the format stream \def\yyuniontag{\yyunion} \def\parserstrictnamespace{parser-strict} \def\parserprototypesnamespace{parser-strict:headers} \def\yyunion{\currentyyunionnamespace} \def\currentyyunionnamespace{generic} % types inserted by the input routines: these should not be tampered with randomly % therefore they are not included in the yyunion list and only defined once below and redefined later % permanently % insidemost \long\def\stashed#1{} % stashed material (usually \Cee\ code) :: \stashed{tex_string} \long\def\sflush#1#2{} % stash flushing marker :: \sflush{tex_string} \def\format#1{} % format material triggered by braces and the start of production :: \format{tex_string} \def\formatlocal#1{} % format material triggered by every term :: \formatlocal{tex_string} % level 1 \long\def\strm[#1]#2.[#3]{} % a stream element :: \strm[digits]{\stashed|\format|\formatlocal}.[digits] % types returned by the lexer (* marks the types that get removed by the parser in some cases) \def\midf#1#2{} % rule separator :: \midf{fptr}{sptr} \defp\stringify#1#2#3#4{} % STRING :: \stringify{12string}{tex_string}{fptr}{sptr} \defp\idit#1#2#3#4{} % ID :: \idit{12string}{tex_string}{fptr}{sptr} \defp\tagit#1#2#3#4{} % TAG :: \tagit{12string}{tex_string}{fptr}{sptr} \defp\charit#1#2#3#4{} % CHAR :: \charit{12string}{tex_string}{fptr}{sptr} \defp\anint#1#2#3{} % INT :: \anint{digits}{fptr}{sptr} \defp\hexint#1#2#3{} % INT :: \hexint{0[xX][0-9A-F]+}{fptr}{sptr} \defp\braceit#1#2#3{} % *BRACED_CODE :: \braceit{tex_string}{fptr}{sptr} \defp\preckind#1#2#3{} % *precedence operator :: \preckind{12string}{fptr}{sptr} \defp\flexoptionpair#1#2{} % a flex option :: \flexoptoinpair{\idit}{\idit|\stringify} % types inserted by the parser % insidemost \defp\termname#1#2{} % a production term :: \termname{\idit|\stringify|\charit}{\idit} \defp\mergeop#1#2#3{} % merge directive :: \mergeop{\tagit}{fptr}{sptr} \defp\dprecop#1#2#3{} % dprec directive :: \dprecop{\anint|\hexint}{fptr}{sptr} \defp\sprecop#1#2#3{} % prec directive :: \sprecop{\idit|\stringify|\charit}{fptr}{sptr} \defp\rrhssep#1#2{} % :: \rrhssep{fptr}{sptr} \defp\arhssep#1#2{} % :: \arhssep{fptr}{sptr} \defp\rarhssep#1#2{} % :: \rarhssep{fptr}{sptr} \defp\hspace#1#2{} % a space has to take two parameters just like any connector :: \hspace{fptr}{sptr} \defp\emptyterm{} \defp\onesymbol#1#2#3{} % a symbol definition :: \onesymbol{\idit}{\anint|\hexint}{\stringify} \defp\bracedvalue#1#2#3{} % a braced variable value :: \bracedvalue{tex_string}{fptr}{sptr} %level 1 \defp\rhs#1#2#3{} % a `right-hand side' :: \rhs{[\termname\hspace\rarhssep\arhssep\actbraces]+}{\arhssep|}{\ifrhsfull} \defp\actbraces#1#2#3#4#5\bdend{} % action braces :: \actbraces{tex_string}{\idit|}{fptr}{sptr}directive*\bdend \defp\bpredicate#1#2#3#4#5\bdend{} % predicate :: \bpredicate{tex_string}{}{fptr}{sptr}directive*\bdend % level 2 \defp\prodheader#1#2#3#4{} % a `left-hand side' of a production :: \prodheader{\idit}{\idit}{fptr}{sptr} \defp\rules#1#2#3{} % a complete right-hand side :: \rules{[\rhs|\rrhssep]}{max fptr}{max sptr} \defp\symbolprec#1#2{} % symbol precedence :: \symbolprec{\idit|\stringify|\charit}{\anint|\hexint} %\def\pcluster#1#2{} % a production cluster :: \pcluster{\prodheader}{\termname|...} should never appear in the final output % level 3 \defp\oneproduction#1#2#3{} % a complete production :: \oneproduction{\prodheader\rules}{fptr}{sptr} \defp\prodprodsepsmall{} % production separator \defp\prodprodsep{} % production separator \defp\prodprodseplarge{} % production separator \defp\optoptsepsmall{} % separator between options \defp\posmark#1#2{} % the position marker :: \posmark{fptr}{sptr} \defp\tokendecls#1#2#3{} % token declarations :: \tokendecls{[\onesymbol]+}{fptr}{sptr} \defp\ntermdecls#1#2#3{} % nterm declarations :: \ntermdecls{[\onesymbol]+}{fptr}{sptr} \defp\typedecls#1#2#3#4{} % type declarations :: \typedecls{\tagit}{[\idit\stringify\charit]+}{fptr}{sptr} \defp\precdecls#1#2#3#4#5{} % precedence declarations :: \precdecls{left|right|nonassoc|precedence}{\tagit}{[\idit\stringify\charit]+}{fptr}{sptr} \defp\flexsstatedecls#1#2#3{} % flex state declarations (nonexlusive) :: \flexsstatedecls{[\idit\stringify]+}{fptr}{sptr} \defp\flexxstatedecls#1#2#3{} % flex state declarations (exclusive) :: \flexxstatedecls{[\idit\stringify]+}{fptr}{sptr} \defp\flexoptiondecls#1#2#3{} % flex state declarations :: \flexoptiondecls{[\flexoptionpair]+}{fptr}{sptr} \defp\oneparametricoption#1#2#3#4{} % option :: \oneparametricoption{option-name}{\stringify|\idit}{fptr}{sptr} \defp\optionflag#1#2#3#4{} % option flag :: \optionflag{flag name}{abbreviated name}{fptr}{sptr} \defp\paramdef#1#2#3#4{} % parameters :: \paramdef{\braceit}{parameter domain}{fptr}{sptr} \defp\codepropstype#1#2#3#4#5#6#7{} % term method :: \codepropstype{printer|destructor}{tex_string}{\stringit|\idit}{fptr}{sptr}{fptr}{sptr} \defp\initaction#1#2#3{} % initial action :: \initaction{tex_string}{fptr}{sptr} \defp\codeassoc#1#2#3#4#5#6#7{} % code association :: \codeassoc{code kind}{|\idit}{tex_string}{fptr}{sptr}{fptr}{sptr} \defp\vardef#1#2#3#4{} % variable definition :: \vardef{\idit|\stringify}{|\idit|\stringify|\bracedvalue}{fptr}{sptr} \defp\prologuecode#1#2#3#4#5{} % prologue code :: \prologuecode{tex_string}{fptr}{sptr}{fptr}{sptr} % level 4 %\def\grammar#1#2{} % a grammar: should never appear in the final output \savecslist{parser-prototypes}\yyunion % table construction: the macros run to build the contents of the table of productions to be % typeset. \newtoks\table \newtoks\tokdectoks \newtoks\opttable \newtoks\typestable \newtoks\prectable \newtoks\tokstoks \newtoks\typesset \let\rhscont\getsecond \let\rhscnct\getthird \let\rhsbool\getfourth \newif\ifrhsfull \newtoks\yystashlocal \newtoks\yyformatlocal \newif\iftermindex \def\doparse#1{% \table{}\typestable{}\prectable{}\opttable{}% \parserinit\yyparse#1\yyeof\yyeof\endparseinput\endparse } \long\def\strm[#1]#2.[#3]{#2} \long\def\inmath#1{$#1$} \long\def\stashed#1{\toksa\expandafter{\the\toksa#1}} \long\def\sflush#1#2{} \def\ntt{\noexpand\ntt@} % a convenient shortcut \def\ntt@{\tt\let\_\UL} \def\prodheader#1#2#3#4{% \yyreadfifo\yyformat\to#3\in\yyformatlocal \restorecs{table-render}{\strm}\the\yyformatlocal \let\termindex\writeidxhentry \prodhead@r{#1}{#2}% \let\termindex\eatone } \def\headeridxrank{1} % index rank of lhs \def\writeidxhentry#1{\write\gindex{% \nx\nx \expandafter \nx \csname\bisonidxdomain TI\endcsname\headeridxrank#1}% } \def\prodhead@r#1#2{% \let\idit\prodhdridit #1\relax\concat\table\toksa\hrhss@p } \def\hrhss@p{\toksa{&\omit\hfil&\omit\hfil&\omit\hfil\cr\noalign{\penalty100}\omit\hfil&\termspostformat}\concat\table\toksa} \def\rrhssep#1#2{% \yyreadfifot\yyformat\to#1\in\yyformatlocal\with\formatsort\relax \the\yyformatlocal % this will have a chance to change the definition of \rrhss@p \rrhss@p } \def\rrhss@p{\toksa{\omit\hfil&}\concat\table\toksa} \def\arhssep#1#2{% \yyreadfifo\yyformat\to#1\in\yyformatlocal \the\yyformatlocal % this will have a chance to change the definition of \arhss@p \arhss@p } %% between the inline action and next term: \def\arhss@p{\toksa{\omit\hfil&\hbox to 2em{\hfil}}\concat\table\toksa} \def\rarhssep#1#2{% \yyreadfifo\yyformat\to#1\in\yyformatlocal \the\yyformatlocal % this will have a chance to change the definition of \rarhss@p \rarhss@p } %% between a term and the following action \def\rarhss@p{\appendr\table&} \newtoks\hstoks \def\hspace#1#2{% \hstoks\yyformat \yyreadfifot\yyformat\to#1\in\yyformatlocal\with\formatsort\relax \the\yyformatlocal % may change \hspac@ \hspac@ } \def\hspac@{% \appendr\table{ }% } \def\rhs#1#2#3{#1} \def\supplybdirective#1#2{% \edef\next{\nx\s@pplybdirective#1{\the#2}\the#1\nx\bdend}\next } \def\s@pplybdirective#1#2#3\bdend\bdend{% #1{#3#2\bdend}% } \def\termname#1#2{% \let\idit\termnameidit \let\stringify\termnamestringify \let\optstrextra\optstrextraesc \let\termindex\writeidxentry #1\relax\concat\table\toksa \let\termindex\eatone } \def\bisonidxdomain{B} % marker fo the domain (section of the index) \def\termidxrank{2} % rank (affects the order in which the entries are % listed in the index and the listing style) \def\writeidxentry#1{\write\gindex{% \nx\nx \expandafter \nx \csname\bisonidxdomain TI\endcsname\termidxrank#1}% } \let\termindex\eatone % index implementation % note that the rank and domain parameters are handed down by the % `outer' macro while the `qualifier' (\term...string) is decided % at the point of invocation \def\gidxentry#1#2{% a generic index entry \iftermindex \termindex{% {\nx\nx\nx#1{\charstonumberse#2\end}}% {\hostparsernamespace}{\nx\the\pageno}{\secno}% }% \fi } \def\tidxentry#1#2{% a text index entry \iftermindex \write\gindex{% \nx\nx\expandafter\nx\csname\bisonidxdomain TI\endcsname\termidxrank {\nx\nx\nx#1{\charstonumberse#2\end}}% {\indexpseudonamespace}{\nx\the\pageno}{\secno}% }% \fi } % \newtoks\bdirects \def\actbraces#1#2#3#4#5\bdend{% \yyreadfifo\yyformat\to#3\in\yyformatlocal \restorecs{table-render}{\strm}% #5% accumulate all the directives \edef\next{\the\bdirects}% \ifx\next\empty \else \edef\next{\bdirects{% $\vtop{\halign{\nx\quad####\nx\hfil&####\nx\hfil\cr\the\bdirects}}$}}\next \fi \the\yyformatlocal \actbrac@s{#1}{#2}{#4}% } \def\actbrac@s#1#2#3{% \yyreadfifo\yystash\to#3\in\yystashlocal \unmathstash{#3}% \edef\next{\toksa{\the\bdirects&\the\yystashlocal\cr}}\next \bdirects{}% \concat\table\toksa } \def\unmathstash#1{% \setbox\z@=\vbox{ \hsize\maxdimen\emergencystretch\maxdimen \rightskip\z@ plus 1fill \let\TeXx\relax\let\stashed\copystashed \the\yystashlocal\relax \ifmmode {}$\aftergroup\unm@thstash % $o that the box can be finished \else \aftergroup\eatone \fi}{#1}% } \def\copystashed#1{#1} \def\unm@thstash#1{% \toksa{\strm[NaN]{\stashed{{}$}}.[NaN]}% $o it cannot be matched if \yystashlocal is read again \concat\yystashlocal\toksa \toksa{\strm[#1]{\stashed{${}}}.[#1]}%$ \appendl\yystash{\the\toksa}% } \def\bpredicate#1#2#3#4#5\bdend{% \yyreadfifo\yyformat\to#3\in\yyformatlocal \restorecs{table-render}{\strm}% #5% accumulate all the directives \edef\next{\the\bdirects}% \ifx\next\empty \bdirects{\quad$\dashv\ \nx\vdash$}% \else \edef\next{\bdirects{% $\vtop{\halign{\nx\quad####\nx\hfil&####\nx\hfil\cr$\dashv\ $&\omit\nx\hfil$\nx\vdash$\cr \the\bdirects}}$}}\next \fi \the\yyformatlocal \bpredicat@{#1}{#2}{#4}% } \def\bpredicat@#1#2#3{% \yyreadfifo\yystash\to#3\in\yystashlocal \unmathstash{#3}% \edef\next{\toksa{\the\bdirects&\the\yystashlocal\cr}}\next \bdirects{}% \concat\table\toksa } \def\bdirective#1#2#3#4{% \savecslist{local-namespace}\yyunion \restorecslist{table-render:directives}\yyunion \toksa{}% #2% make a directive list \edef\next{\toksa{$\nx\langle${\ntt #1} &\the\toksa$\nx\rangle$\cr}}\next \concat\bdirects\toksa \restorecslist{local-namespace}\yyunion } \def\mergeop#1#2#3{% \bdirective{merge}{#1}{#2}{#3}% } \def\dprecop#1#2#3{% \bdirective{dprec}{#1}{#2}{#3}% } \def\sprecop#1#2#3{% \bdirective{prec}{#1}{#2}{#3}% } \def\rules#1#2#3{#1} \def\oneproduction#1#2#3{#1\setrulecontext{}\stopproduction} % to make it possible to typeset tokens depending on their context % the context name is passed to the token typeseting macros; the most % common context name is the left hand side of a production; special % context names (such as *left, *right, etc) are defined for terms that are % not part of a rule; all such context names start with `*' since this % character cannot be part of a term name \def\setrulecontext#1{\def\currentrulecontext{#1}} \let\currentrulecontext\empty \def\emptyterm{% \edef\next{\toksa{$\nx\circ$\tidxentry{\termidstring}{emptyrhs}}}\next \concat\table\toksa } \def\termnameidit#1#2#3#4{% \yyreadfifot\yyformat\to#3\in\yyformatlocal\with\formatsort\relax \the\yyformatlocal \nameproc{#2}% \peekstash{#4}% \settermstyle{#1}% } \def\settermstyle#1{% \edef\next{\toksa{\termmetastyle{% \gidxentry{\termidstring}{#1}% \let\nx\idxfont\nx\empty\nx\it\the\toksa\nx\/% }}}\next } \def\idxinline#1{% index the term in text \edef\next{\tidxentry{\termidstring}{#1}}\next } \def\termnamestringify#1#2#3#4{% \nameproc{#2}% \edef\next{\toksa{{% \gidxentry{\termstring}{#1}% \ntt\the\toksa }}}\next } \def\termmetastyle#1{{#1}} \let\peekstash\eatone \newif\ifinheader \def\prodhdridit#1#2#3#4{% \setrulecontext{}% \nameproc{#2}% \expandafter\setrulecontext\expandafter{\the\toksc}% \edef\next{\toksa{{% \gidxentry{\termhdrstring}{#1}% \nx\inheadertrue\let\nx\idxfont\nx\bf\nx\itbold\the\toksa\nx\/% }}}\next } \def\charit#1#2#3#4{% \expandafter\ifx\csname'parser'\hostparsernamespace#1\endcsname\relax \edef\next{\toksa{{\ntt #1}\gidxentry{\termvstring}{'#1'}}}% \else \edef\next{\expandafter\toksa\expandafter{\expandafter\noexpand \csname'parser'\hostparsernamespace#1\endcsname{\currentrulecontext}\gidxentry{\termvstring}{'#1'}}}% \fi \next } \def\anint#1#2#3{% \toksa{#1}\concat\table\toksa } \def\hexint#1#2#3{% \toksa\expandafter{\eattwo#1$_{16}$}\concat\table\toksa } \def\optoptsepnone{% \concat\opttable\postoks } \def\optoptsepsmall{% keep the alignment going but insert a small space \concat\opttable\postoks \toksa{\noalign{\smallskip}}\concat\opttable\toksa } \def\prodprodsepsmall{% \pushothertables \toksa{\noalign{\penalty-150 \smallskip}}\concat\table\toksa } \def\prodprodsep{% \pushothertables \toksa{\noalign{\medskip}}\concat\table\toksa } \def\prodprodseplarge{% \pushothertables \toksa{\noalign{\bigskip}}\concat\table\toksa } \def\separatorswitcheq{% \oneproduction {% \toksd{\prodprodsepsmall}% } \codepropstype\codeassoc {% \toksd{\optoptsepsmall}% } } \def\separatorswitchdefaulteq{% \toksd{\optoptsepnone}% } % a switch for inserting position information into the parsed table % clobbers \toksd \newtoks\postoks \def\positionswitch{ \empty {% \postoks{}% semicolons should be invisible } \paramdef\oneparametricoption\optionflag\typedecls\vardef {% \getfourth{\yy(2)}\to\postoks % the format marker \getfifth{\yy(2)}\to\toksd % the stash marker \edef\next{\postoks{\nx\posmark{\the\postoks}{\the\toksd}}}\next } \prologuecode\ntermdecls\tokendecls \flexsstatedecls\flexxstatedecls\flexoptiondecls {% \getthird{\yy(2)}\to\postoks % the format marker \getfourth{\yy(2)}\to\toksd % the stash marker \edef\next{\postoks{\nx\posmark{\the\postoks}{\the\toksd}}}\next } \precdecls {% \getfifth{\yy(2)}\to\postoks % the format marker \getsixth{\yy(2)}\to\toksd % the stash marker \edef\next{\postoks{\nx\posmark{\the\postoks}{\the\toksd}}}\next } \oneproduction {% \getsecond{\yy(2)}\to\postoks % the \prodheader \getfourth{\postoks}\to\toksd % the format marker \getfifth{\postoks}\to\postoks % the stash marker \edef\next{\postoks{\nx\posmark{\the\toksd}{\the\postoks}}}\next } \codeassoc\codepropstype {% \getseventh{\yy(2)}\to\postoks % the format marker \geteightth{\yy(2)}\to\toksd % the stash marker \edef\next{\postoks{\nx\posmark{\the\postoks}{\the\toksd}}}\next } } \def\positionswitchdefault{% \errmessage{unknown chunk type in: \the\yy(2)}% } \def\posmark#1#2{% % \yyreadfifo\yyformat\to#1\in\yyformatlocal % no formattig for locations currently \restorecs{table-render}{\strm}% % \the\yyformatlocal \posm@rk{#2}% } \def\posm@rk#1{% \yyreadfifo\yystash\to#1\in\yystashlocal \edef\next{\the\yystashlocal}% \ifx\next\empty \postoks{}% \else \unmathstash{#1}% % TODO: move this out \toksa{}\the\yystashlocal\cleanstash\stripstash \setbox\z@=\vbox{\setlazyc\the\toksa}% \ifnum\ht\z@=\z@ \postoks{}% \else \edef\next{\postoks{\noalign{\indent\toksa{}\the\yystashlocal\nx\makestashbox}}}\next \fi \fi } \def\codeoptionlist{% \codepropstype\codeassoc\prologuecode } \def\simpleoptionsplit{% \oneparametricoption\vardef\paramdef\optionflag } \def\noncodeoptionlist{% \oneparametricoption\vardef\paramdef\optionflag \codepropstype\codeassoc\prologuecode } \def\alloptionlist{% \oneparametricoption\vardef\paramdef\optionflag \codepropstype\codeassoc\prologuecode \typedecls\tokendecls\precdecls\oneproduction \flexsstatedecls\flexxstatedecls\flexoptiondecls } \def\emptyoption{\empty} \diagprod\codeoptionlist\noncodeoptionlist\in\codenoncodeseplist \diagprod\simpleoptionsplit\simpleoptionsplit\in\noncodenoncodeseplist \diagprod\alloptionlist\emptyoption\in\emptyotherseplist % this is a switch for inserting separators between dissimilar items \def\separatorswitchneq{% \classexpand\codenoncodeseplist {% separate options with code (\codepropstype, \codeassoc) from other options by a small space \toksd{\optoptsepsmall}% } \classexpand\noncodenoncodeseplist {% \toksd{\optoptsepnone}% } % a separator after the first rule or before or after a semicolon \classexpand\emptyotherseplist {% \toksd{\optoptsepnone}% } } \setspecialcharsfrom\separatorswitchneq \def\separatorswitchdefaultneq{% \toksd{\prodprodsep}% } \def\pushothertables{% %token's \edef\next{\the\tokdectoks}% \ifx\next\empty \else \attachtokentable \fi %type's \edef\next{\the\typestable}% \ifx\next\empty \else \attachtypestable \fi %precedence's \edef\next{\the\prectable}% \ifx\next\empty \else \attachprectable \fi % options \edef\next{\the\opttable}% \ifx\next\empty \else \attachoptionstable \fi \concat\table\postoks } % % the various \attach... macros above are defined elsewhere and are the macros that % determine the actual typesetting of the corresponding tables. \let\stopproduction\relax \def\tokendecls#1#2#3{% \savecslist{local-namespace}{\yyunion\termindex}% \restorecslist{table-render:token-declarations}\yyunion \let\termindex\writetokenidxentry \displaytokenrawtrue \let\currenttokentype\empty#1% \restorecslist{local-namespace}{\yyunion\termindex}% } \def\typedecls#1#2#3#4{% \savecslist{local-namespace}{\yyunion\termindex}% \restorecslist{table-render:type-declarations}\yyunion \let\termindex\writetokenidxentry \typesset{}% #2\relax#1% \edef\next{\typestable{\the\typestable\nx\onetype{\the\toksa}{\the\typesset}}}\next \restorecslist{local-namespace}{\yyunion\termindex}% } % \onetype is a typeseting macro defined elsewhere \def\flexsstatedecls#1#2#3{% \savecslist{local-namespace}{\yyunion\termindex}% \restorecslist{table-render:flex-state-declarations}\yyunion \let\termindex\writetokenidxentry \typesset{}% #1\relax \edef\next{\typestable{\the\typestable\nx\flexsstatelist{\the\typesset}}}\next \restorecslist{local-namespace}{\yyunion\termindex}% } \def\flexxstatedecls#1#2#3{% \savecslist{local-namespace}{\yyunion\termindex}% \restorecslist{table-render:flex-state-declarations}\yyunion \let\termindex\writetokenidxentry \typesset{}% #1\relax \edef\next{\typestable{\the\typestable\nx\flexxstatelist{\the\typesset}}}\next \restorecslist{local-namespace}{\yyunion\termindex}% } % \flexsstatelist and \flexxstatelist are typesetting macros defined elsewhere \def\flexoptiondecls#1#2#3{% \savecslist{local-namespace}{\yyunion\termindex}% \restorecslist{table-render:flex-option-definitions}\yyunion \let\termindex\writetokenidxentry \toksa{}% #1\relax \restorecslist{local-namespace}{\yyunion\termindex}% } \def\precdecls#1#2#3#4#5{% #1 type % #2 tag % #3 list of symbols % #4 format pointer % #5 stash pointer \savecslist{local-namespace}{\yyunion\termindex}% \restorecslist{table-render:prec-declarations}\yyunion \setrulecontext{*#1}% \let\termindex\writetokenidxentry \typesset{}#3\toksa{}#2% \edef\next{\prectable{\the\prectable\noexpand\oneprec{#1}{\the\toksa}{\the\typesset}}}\next \restorecslist{local-namespace}{\yyunion\termindex}% \setrulecontext{}% } % \oneprec is a typesetting macro defined elsewhere % options typesetting \def\oneparametricoption#1#2#3#4{% \restorecs{table-render:token-declarations}{\braceit\stringify\idit\anint\hexint}% \toksa{}\toksb{}\toksc{}% #2% \edef\next{\noexpand\oneparametricopti@n{#1}{\the\toksa}{\the\toksb}{\the\toksc}}\next } \def\oneparametricopti@n#1#2#3#4{% \edef\next{#2}% \ifx\next\empty % there is no identifier \def\next{#4}% \ifx\next\empty % there is no digit \edef\next{\toksa{{\ntt"\the\toksb"}}}\next \else \edef\next{\toksa{{\nx\rm\the\toksc}}}\next \fi \else \nameproc{#2}% \fi % now \toksa contains the value of the parameter \toksb{#1}% \let\termindex\writetokenidxentry \edef\next{\toksa{\gidxentry{\termostring}{#1}$\nx\langle${\nx\bf\the\toksb}$\nx\rangle$&\the\toksa\nx\/\nx\cr}}\next \let\termindex\eatone \concat\opttable\toksa } \def\paramdef#1#2#3#4{% \restorecs{table-render:token-declarations}\braceit \let\termindex\writetokenidxentry \edef\next{\toksa{\gidxentry{\termostring}{#2}}}\next \toksb\expandafter{\the\toksa$\langle${\bf #2}$\rangle$}\toksa{}% #1% \let\termindex\eatone \concat\toksb\toksa \concat\opttable\toksb } \def\optionflag#1#2#3#4{% \def\next{#2}% \ifx\next\empty \toksb{}% \else \toksb{ {\rm(set as $\langle${\bf#2}$\rangle$)}}% \fi \let\termindex\writetokenidxentry \edef\next{\toksa{\gidxentry{\termostring}{#1}$\nx\langle${\nx\bf#1}$\nx\rangle$\nx\rlap{$\nx\,\star$}&\the\toksb\cr}}\next \let\termindex\eatone \concat\opttable\toksa } \def\codepropstype#1#2#3#4#5#6#7{% \yyreadfifo\yyformat\to#4\in\yyformatlocal \restorecs{table-render}{\strm}% \the\yyformatlocal % this can change \codepropstyp@ \codepropstyp@{#2}{#3}{#1}{#5}% } \def\codepropstyp@#1#2#3#4{% \yyreadfifo\yystash\to#4\in\yystashlocal \unmathstash{#4}% \restorecs{table-render:type-declarations}{\idit\stringify\hspace}% \let\termindex\writetokenidxentry \typesset{}% #2% collect all the symbols in \typesset \edef\next{\toksa{\gidxentry{\termostring}{#3}$\nx\langle${\nx\bf #3}$\nx\rangle$&% \toksa{}\the\yystashlocal\nx\makestashbox\nx\hfil\cr \noalign{\nx\smallskip}% \noalign{\indent$\nx\rlap{\hbox to2em{\nx\hfil$\nx\star$\nx\hfil}}\vcenter{ \advance\hsize by-\parindent \emergencystretch10pt\nx\raggedright\noindent\hangafter\z@\hangindent2em\nx\strut\the\typesset\nx\strut}$}% }}\next \let\termindex\eatone \concat\opttable\toksa } \def\codeassoc#1#2#3#4#5#6#7{% \yyreadfifo\yyformat\to#4\in\yyformatlocal \restorecs{table-render}{\strm}% \the\yyformatlocal % this can change \codeass@c \codeass@c{#1}{#2}{#3}{#5}% } \def\codeass@c#1#2#3#4{% \yyreadfifo\yystash\to#4\in\yystashlocal \unmathstash{#4}% \let\idit\termnameidit \let\termindex\writetokenidxentry \toksa{}% in case #1 is empty #2% put the typeset form of the identifie in \toksa \toksb\toksa \edef\next{\toksa{\yystringempty{#1}{}{\gidxentry{\termostring}{#1}}% $\nx\langle${\nx\bf #1}$\nx\rangle$\nx\quad{\the\toksb}&% \toksa{}\the\yystashlocal \nx\makestashbox \nx\hfil\cr }}\next \concat\opttable\toksa \let\termindex\eatone } \def\vardef#1#2#3#4{% \yyreadfifo\yyformat\to#3\in\yyformatlocal \restorecs{table-render}{\strm}% \the\yyformatlocal % this can change \vard@f \vard@f{#1}{#2}{#4}% } \def\vard@f#1#2#3{% \let\idit\termnameidit \let\stringify\termnamestringify \let\termindex\writetokenidxentry #1% put the typeset form of the identifier or string in \toksa \toksb\toksa \savecslist{local-namespace}\yyunion \restorecslist{table-render:variable-definitions}\yyunion \toksa{}% in case #2 is empty #2% put the value in toksa \toksc\toksa \restorecslist{local-namespace}\yyunion \let\termindex\eatone \edef\next{\toksa{$\nx\langle${\nx\bf define}$\nx\rangle$\nx\quad{\the\toksb}&% \the\toksc\cr }}\next \concat\opttable\toksa } \def\prologuecode#1#2#3#4#5{% similar to \actbrac@s \yyreadfifo\yystash\to#5\in\yystashlocal \unmathstash{#5}% \restorecs{table-render}{\strm\stashed}% \toksa{}\the\yystashlocal \edef\next{\toksa{\omit\span\omit\nx\cdotfill\cr \omit\span\omit\toksa{\the\toksa}\nx\makestashbox\nx\cr \omit\span\omit\nx\cdotfill\cr}}\next \concat\opttable\toksa } \def\yyunion@tablerender{% \strm\stashed\rarhss@p\rrhss@p\prodhead@r\hrhss@p\arhss@p\actbrac@s\hspac@\codepropstyp@\vard@f\stopproduction \termmetastyle\peekstash } \savecslist{table-render}\yyunion \savecslist{table-render}\yyunion@tablerender \def\setprodtable{% \restorecslist{table-render}\yyunion \restorecslist{table-render}\yyunion@tablerender } % formatting macros \def\midf#1#2{} \def\format#1{% #1% } \let\formatlocal\format \newtoks\yystashlastcontent % contents of the last action \newif\ifshowlastaction % if true, show the last action of a flattened set of rules \def\flatten{% \let\stopproduction\stopproduction@flatten \let\actbrac@s\actbrac@s@flatten \let\rrhss@p\rrhss@p@flatten \let\arhss@p\relax \let\rarhss@p\relax } \def\actbrac@s@flatten#1#2#3{% do everything but add the stash contents to the table \yyreadfifo\yystash\to#3\in\yystashlocal \unmathstash{#3}% \yystashlastcontent\yystashlocal \futurelet\actsep\actbrac@s@fl@tten } \def\actbrac@s@fl@tten{% \ifx\actsep\arhssep \edef\next{% \toksa{$\nx\ \nx\diamond\nx\ $\tidxentry{\termidstring}{inline_action}}}\next \concat\table\toksa \fi } \def\rrhss@p@flatten{% \toksa{$\ \vert\ $}\concat\table\toksa }% \def\stopproduction@flatten{% \ifshowlastaction \toksa\yystashlastcontent \else \toksa{\actionfiller}% \fi \toksa\expandafter{\expandafter&\expandafter&\the\toksa\cr}\concat\table\toksa } \def\fold{% \restorecs{table-render}{\actbrac@s\rrhss@p\arhss@p\rarhss@p\stopproduction}% \ifshowlastaction \toksa\yystashlastcontent \else \toksa{\actionfiller}% \fi \toksa\expandafter{\expandafter&\expandafter&\the\toksa\cr}\concat\table\toksa } \def\actionfiller{\omit\quad$\ldots$\hfil} \def\inline{% \let\prodhead@r\prodhead@r@inline \let\hrhss@p\hrhss@p@inline } \def\prodhead@r@inline#1#2{% \let\idit\prodhdridit #1\relax \setbox\z@=\hbox{\strut\the\toksa\/$\,$\rm:\quad}% \tempda=\wd\z@\relax \advance\tempda-2em \edef\next{\table{\the\table{\the\toksa}}}\next \hrhss@p } \newif\ifsquashterms \def\termspostformat{\ifsquashterms\aftergroup\noexpand\squashtermstrue\fi} \def\hrhss@p@inline{% \edef\next{\toksa{&\termspostformat\hbox to \the\tempda{\hss}}}\next\concat\table\toksa } \def\breakline{% \let\hspac@\hspac@@breakline } \def\hspac@@breakline{% \toksa{{$\,\hookleftarrow$}&\omit\hfil&\omit\hfil\cr\omit\hfil&\hbox to 2em{\hfil}}\concat\table\toksa \restorecs{table-render}\hspac@ } \def\skipheader{% \let\prodhead@r\prodhead@r@skipheader \let\hrhss@p\hrhss@p@skipheader } \def\prodhead@r@skipheader#1#2{% \hrhss@p } \def\hrhss@p@skipheader{\toksa{\omit\hbox to 2em{\hfil}&\termspostformat}\concat\table\toksa\restorecs{table-render}{\hrhss@p}} \def\stashtoterm#1{% in case one needs to insert previous stash as a term % usage: \let\peekstash\stashtoterm \yyreadfifo\yystash\to#1\in\yystashlocal \unmathstash{#1}% \edef\next{\toksb{{% \nx\restorecs{table-render}{\nx\stashed\nx\strm}% \toksa{}\the\yystashlocal\nx\makestashbox}}}\next \def\termmetastyle##1{\the\toksb}% \restorecs{table-render}\peekstash } \def\resetf{% \restorecs{table-render}{\prodheader\prodhead@r\hrhss@p\rrhss@p\arhss@p\rhs\termname\actbraces\actbrac@s\rarhss@p\hspac@\rules \oneproduction\emptyterm\stringify\idit\charit\prodprodsep\onesymbol\strm\stopproduction}% \squashtermsfalse } \def\prodstyle#1{% to typeset token names in text {% \let\optstrextra\optstrextraesc \nameproc{#1}% \settermstyle{#1}% \the\toksa\nobreak }% } % macros used in typesetting the result of the prologue parsing %type declarations \restorecslist{parser-strict}\yyunion \def\idit#1#2#3#4{% \termnameidit{#1}{#2}{#3}{#4}% \concat\typesset\toksa } \def\stringify#1#2#3#4{% \termnamestringify{#1}{#2}{#3}{#4}% \concat\typesset\toksa } \def\hspace#1#2{% \appendr\typesset{ }% } \def\charit#1#2#3#4{% \toksa{\.{#2}}% \concat\typesset\toksa } \def\tagit#1#2#3#4{% \toksa{\\{#2}}% } \toyyunion{table-render:type-declarations} %token declarations \newif\iftracetokennames \restorecslist{parser-strict}\yyunion \def\hspace#1#2{} \def\idit#1#2#3#4{\toksa{#2}} \def\charit#1#2#3#4{\toksa{'#1'}} \def\stringify#1#2#3#4{\toksb{#2}} \def\anint#1#2#3{\toksc{#1}} \def\hexint#1#2#3{\toksc\expandafter{\eattwo#1$_{16}$}} \def\tagit#1#2#3#4{% \def\currenttokentype{#2}% } \def\braceit#1#2#3{% similar to \actbrac@s \yyreadfifo\yystash\to#3\in\yystashlocal \unmathstash{#3}% \restorecs{table-render}{\strm\stashed}% \toksa{}\the\yystashlocal \edef\next{\toksa{&\toksa{\the\toksa}\nx\makestashbox\nx\cr}}\next } \def\onesymbol#1#2#3{% #1 is the macro name used internally by bison (\idit{}{}{}{}) % #2 is the integer value (\anint{}{}{}) % #3 is the string value (\stringify{}{}{}{}) \toksa{}\toksb{}\toksc{}% #1#2#3\relax \edef\next{\noexpand\onesymb@l{\the\toksa}{\the\toksc}{\the\toksb}}\next } \def\onesymb@l#1#2#3{% #1 is the macro name used internally by bison % #2 is the integer value % #3 is the string value \let\optstrextra\optstrextraesc \yystringempty{#3}{}{\nameproc{#3}\tokstoks\toksa}% \yystringempty{#1}{}{\nameproc{#1}}% \iftracetokennames\derrmessage{token: \the\toksa, string: \the\tokstoks}\fi \toksb\expandafter{\currenttokentype}% \edef\next{% \tokdectoks{\the\tokdectoks \noexpand\toksdefline {\the\toksa}% {% \yystringempty{#1}{}{\gidxentry{\termidstring}{#1}}% \yystringempty{#3}{}{\gidxentry{\termstring}{#3}}% }% {\yytoksempty\toksb{auto}{\the\toksb}}% {#2}% {\the\tokstoks}% }% }\next \restorecs{nameparser}{\optstrextra}% } \def\defidxrank{0} % index rank of definitions \def\writetokenidxentry#1{\write\gindex{% \nx\nx \expandafter \nx \csname\bisonidxdomain TI\endcsname\defidxrank#1}% } \toyyunion{table-render:token-declarations} %precedence declarations \restorecslist{parser-strict}\yyunion \def\idit#1#2#3#4{% \termnameidit{#1}{#2}{#3}{#4}% \concat\typesset\toksa } \def\stringify#1#2#3#4{% \termnamestringify{#1}{#2}{#3}{#4}% \concat\typesset\toksa } \def\charit#1#2#3#4{% \expandafter\ifx\csname'parser'\hostparsernamespace#1\endcsname\relax \edef\next{\toksa{{\ntt #1}\gidxentry{\termvstring}{'#1'}}}% \else \edef\next{\expandafter\toksa\expandafter{\expandafter\noexpand \csname'parser'\hostparsernamespace#1\endcsname{\currentrulecontext}\gidxentry{\termvstring}{'#1'}}}% \fi \next \concat\typesset\toksa } \def\anint#1#2#3{% \edef\next{\toksa{${}=\hbox{\ntt#1}$}}\next \concat\typesset\toksa } \def\hexint#1#2#3{% \toksa\expandafter{\eattwo#1}% \edef\next{\toksa{${}=\hbox{\ntt\the\toksa}_{16}$}}\next \concat\typesset\toksa } \def\hspace#1#2{% \appendr\typesset{ }% } \def\tagit#1#2#3#4{% \toksa{\\{#2}}% } \def\symbolprec#1#2{% #1#2% } \toyyunion{table-render:prec-declarations} % variable definitions \restorecslist{parser-strict}\yyunion \def\idit#1#2#3#4{\toksa{#2}} \def\stringify#1#2#3#4{\toksa{#2}} \def\bracedvalue#1#2#3{% similar to \actbrac@s \yyreadfifo\yystash\to#3\in\yystashlocal \unmathstash{#3}% \restorecs{table-render}{\strm\stashed}% \toksa{}\the\yystashlocal \edef\next{\toksa{\toksa{\the\toksa}\nx\makestashbox}}\next } \toyyunion{table-render:variable-definitions} % directives \restorecslist{parser-strict}\yyunion \def\idit#1#2#3#4{% \termnameidit{#1}{#2}{#3}{#4}% } \def\stringify#1#2#3#4{% \termnamestringify{#1}{#2}{#3}{#4}% } \def\tagit#1#2#3#4{% \toksa{\\{#2}}% } \def\anint#1#2#3{% \toksa{#1}% } \def\hexint#1#2#3{% \toksa\expandafter{\eattwo#1$_{16}$}% } \toyyunion{table-render:directives} % flex state declarations \restorecslist{parser-strict}\yyunion \def\idit#1#2#3#4{% \nameproc{#2}% \edef\next{\toksa{{% \gidxentry{\termttstring}{#1}% \ntt\the\toksa }}}\next \concat\typesset\toksa } \def\hspace#1#2{% \appendr\typesset{ }% } \toyyunion{table-render:flex-state-declarations} % flex option definitions \restorecslist{parser-strict}\yyunion \def\flexoptionpair#1#2{% #1% \edef\next{#2}% \ifx\next\empty % there is no rihgt hand side \edef\next{\toksa{$\nx\langle${\ntt\the\toksa}$\nx\rangle_{\rm f}\,\star$&\cr}}\next \else \toksb\toksa\toksa{}#2% \edef\next{\toksa{$\nx\langle${\ntt\the\toksb}$\nx\rangle_{\rm f}$&\nx\it\the\toksa\nx\/\nx\cr}}\next \fi \concat\opttable\toksa } \def\idit#1#2#3#4{\toksa{#2}} \def\stringify#1#2#3#4{\toksa{{\ntt@"#2"}}} \def\hspace#1#2{} \toyyunion{table-render:flex-option-definitions} % rule listing macros \restorecslist{parser-prototypes}\yyunion % we just want to ignore the non-rule related code \def\prodheader#1#2#3#4{% #1\relax \lastlastname\lastname \setnumname\numname \lastname{}% #2\relax \edef\next{\toksc{\numname:}\toksd{\noexpand\lhs{\the\lastlastname}{\the\lastname}}}\next } \def\rrhssep#1#2{} \def\arhssep#1#2{} \def\rarhssep#1#2{} \def\hspace#1#2{} \def\rhs#1#2#3{% \concat\toksa\toksc \concat\toksb\toksd #1\relax \edef\next{\toksb{\noexpand\onerule{\the\toksb}}}\next \appendr\toksa\def \possibleimplicitfalse \yyreplacestring\toksa\in\newsymswitch\with\toksb \toksa{}\toksb{}% } \newtoks\lastname \newtoks\lastlastname \def\termname#1#2{% \flushact #1\relax \lastlastname\lastname \setnumname\numname \lastname{}% #2\relax \appendr\toksa{ \numname}\appendr\toksb{\noexpand\term{\the\lastlastname}{\the\lastname}}% } \def\setnumname#1{% \expandafter\let\expandafter\next\csname term\parsernamespace\the\lastname \endcsname \ifx\next\relax % this is a terminal that was renamed \expandafter\ifx\csname token\parsernamespace\the\lastname \endcsname\relax % this is probably a symbol from another grammar \def#1{-1}% \errmessage{token \csname token\parsernamespace\the\lastname \endcsname\space is undefined}% \else \expandafter\tempca\csname token\parsernamespace\the\lastname \endcsname \edef#1{\fgetelemof{yytranslate}\at\tempca}% \fi \else \let#1\next \fi } \def\actbraces#1#2#3#4#5\bdend{% \flushact \lastname{}% #2\relax \edef\next{\lastactsym{\the\lastname}}\next \possibleimplicittrue } \def\rules#1#2#3{#1} \def\oneproduction#1#2#3{#1} \def\emptyterm{% \flushact \lastname{}% } \def\stringify#1#2#3#4{% \lastname{"#1"}% } \def\idit#1#2#3#4{% \lastname{#1}% } \def\charit#1#2#3#4{% \lastname{'#1'}% } \def\prodprodsep{} \def\onesymbol#1#2#3{} \def\anint#1#2#3{% \lastname{#1}% } \def\hexint#1#2#3{% \lastname\expandafter{\expandafter\number\eattwo#1$_{16}$}% } \newtoks\lastactsym \newif\ifpossibleimplicit \def\flushact{% \ifpossibleimplicit \appendr\toksa{ @implicit@}\appendr\toksb{\noexpand\implicitterm{@implicit@}{\the\lastactsym}}% \lastactsym{}% \possibleimplicitfalse \fi } \savecslist{symbols}\yyunion % name parser macros \def\idstr#1#2{% \toksb{#1}% \concat\toksa\toksb \toksb{#2}% \concat\toksc\toksb } \def\chstr#1#2{% \toksb{{\ntt@#1}}% \concat\toksa\toksb \toksb{#2}% \concat\toksc\toksb } \def\sfxi#1#2{\toksb{\/${}_{\idxfont#1}$}\concat\toksa\toksb} \def\sfxn#1#2{\toksb{#1}\concat\toksa\toksb} \def\dotsp{\futurelet\next\d@tsp} \def\d@tsp{% \ifx\next\sfxi \else \ifx\next\qual \else \toksb{.}\concat\toksa\toksb \fi \fi } \def\optstr#1#2{% \toksb\expandafter{\eatone#1}% \optstrextra \concat\toksa\toksb \toksb{#2}% \concat\toksc\toksb } \def\optstrextra{% \edef\next{\toksb{{$\nx\ulcorner$\ntt\the\toksb$\nx\urcorner$}}}\next } \def\optstrextraesc{% \edef\next{\toksb{{$\nx\langle$\ntt\the\toksb$\nx\rangle$}}}\next } \def\qual#1#2{\toksb{\/${}_{\rm#2}$}\concat\toksd\toksb} \let\idxfont\relax \savecs{nameparser}{\idstr\chstr\sfxi\sfxn\qual\optstr\dotsp\optstringextra\idxfont} \newtoks\namechars \newif\iftracebadnames \newif\iftracenames \def\nameproc#1{% \ifbootstrapmode \toksa{}% \else \savecs{local-namespace}\getcurrentparser \tosmallparser \basicparserinit \yyparse#1\yyeof\yyeof\endparseinput\endparse \ifyyparsefail \iftracebadnames \ferrmessage{bad name: #1}% \fi \toksa{#1}\toksc{}% \else \toksa{}\toksb{}\toksc{}\toksd{}% \iftracenames \ferrmessage{parsed name: \the\namechars}% \fi \the\namechars\relax \iftracenames \ferrmessage{processed name: \the\toksa, \the\toksb, \the\toksc, \the\toksd}% \fi \expandafter\ifx\csname'parser'\hostparsernamespace\the\toksc \endcsname\relax \else \toksa\expandafter{\csname'parser'\hostparsernamespace\the\toksc \endcsname}% \appendr\toksa{{\currentrulecontext}}% \fi \concat\toksa\toksd \fi \restorecs{local-namespace}\getcurrentparser \getcurrentparser \fi } %% token typesetting macros \def\setsafe#1{\def\saferword{#1}\setspecialcharsfrom\saferword} \def\prettyword#1{\setsafe{#1}\expandafter\edef\csname'parser'\parsernamespace\saferword\endcsname##1{{\ntt\lowercase{\saferword}}}} \def\prettytoken#1{\setsafe{#1}\expandafter\edef\csname'parser'\parsernamespace\saferword\endcsname##1{{\ntt\saferword}}} \def\prettytoken@#1{\toksa{}\numberstocharsandspaces#1\end\expandafter\edef \csname'parser'\parsernamespace\the\toksa\endcsname##1{{\ntt\the\toksa}}% } \def\prettywordpair#1#2{\setsafe{#1}\expandafter\def\csname'parser'\parsernamespace\saferword\endcsname##1{{\ntt@#2}}} \def\prettywordpair@#1#2{% \setsafe{#1}\toksa{}\numberstocharsandspaces#2\end\expandafter\nameproc\expandafter{\the\toksa}% \expandafter\edef\csname'parser'\parsernamespace\saferword\endcsname##1{% \noexpand\ifdisplaytokenraw {\ntt\saferword}% \noexpand\else {\ntt\def\noexpand\_{\char`\noexpand\_}\the\toksa}% \noexpand\fi }% } \def\prettywordpair@@#1#2{\setsafe{#1}\expandafter\def\csname'parser'\parsernamespace\saferword\endcsname##1{{#2}}} % the bootstrap macros \def\initbootstrap{% \restorecslist{bootstrap}\yyunion } \restorecslist{parser-prototypes}\yyunion \def\tokendecls#1#2#3{#1} \def\stringify#1#2#3#4{\toksa{"#1"}} \def\idit#1#2#3#4{\toksb{#1}} %\def\anint#1#2#3{\toksc{#1}}% this definition is not needed as all %information is extracted from yytname % note that the definitions below do not handle cases such as %token '{' "left brace" since the lexer knows how to return '{' \def\onesymbol#1#2#3{% \toksa{}\toksb{}%\toksc{}% #1#2#3% \yytoksempty\toksa{\expandafter\charstonumbers\the\toksb\end}% {\expandafter\toksa\expandafter{\expandafter}\expandafter\charstonumbers\the\toksa\end}% \yytoksempty\toksb{% \yytoksempty\toksa{}{% \immediate\write\tokendefs{\noexpand\tokeneq{\the\toksb}{\the\toksa}}% }% }{% \immediate\write\tokendefs{\noexpand\tokeneq{\the\toksb}{\the\toksa}}% }% } \def\flexsstatedecls#1#2#3{% bootstrap parser does not produce state declarations so it is fine to share states \savecslist{local-namespace}\yyunion \restorecslist{bootstrap:flex-state-declarations}\yyunion #1\relax \restorecslist{local-namespace}\yyunion } \let\flexxstatedecls\flexsstatedecls \savecslist{bootstrap}\yyunion \restorecslist{parser-strict}\yyunion \def\idit#1#2#3#4{{\immediate\write\stlist{_register_name(#1);}}} \def\hspace#1#2{} \savecslist{bootstrap:flex-state-declarations}\yyunion \def\charstonumberse#1\end{% \yystringempty{#1}{}% {\yystartsinspace{#1}{{\number`\ }\charstonumber@@#1\end}{\charstonumbers@#1\end}}% } \def\charstonumbers@#1{% {\number`#1}\charstonumberse } \def\charstonumber@@#1 {\charstonumberse} \def\charstonumbers#1\end{\edef\next{\toksa{\charstonumberse#1\end}}\next}