From a494a509f3f4a13a450c898488155f7aa5353bd3 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 1 Feb 2024 03:00:51 +0000 Subject: CTAN sync 202402010300 --- support/splint/cweb/fo.w | 185 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 147 insertions(+), 38 deletions(-) (limited to 'support/splint/cweb/fo.w') diff --git a/support/splint/cweb/fo.w b/support/splint/cweb/fo.w index 81694024c3..d34ca57d96 100644 --- a/support/splint/cweb/fo.w +++ b/support/splint/cweb/fo.w @@ -30,14 +30,23 @@ @q PURPOSE. @> @**The \ifbootstrapmode flex \else\flex\ \fi parser stack. -\ifbootstrapmode % this is a bootstrap run to generate the tables +\ifbootstrapmode % this is a bootstrap run to generate the token references \input limbo.sty \def\optimization{5} \input yy.sty + \def\bstrapparser{dyytab.tex}% use the full prologue parser + \def\bstraptokens{bo.tok}% for which we will need token equivalences \modebootstrap \else % otherwise set up the pretty printing of tokens \let\hostparsernamespace\flexnamespace \fi +% we can get away with the setup above because the minimal lexer +% used for bootstrapping does not know about the \prodstyle{\%left} +% token so in the declarations list below, the two tokens, +% \prodstyle{CCL_OP_DIFF} and \prodstyle{CCL_OP_UNION} become +% part of the previous \prodstyle{\%token} declaration which is a +% legal declaration syntax; see ldman.w and ldlex.w and ldgram.w for +% a more elaborate setup; The scanner generator, \flex, uses \bison\ to produce a parser for its input language. Its lexer is output by \flex\ itself so both are reused to generate the parser and the scanner for pretty printing @@ -69,7 +78,7 @@ any custom adjustments to the lexer state to operate correctly. @g @ The selection of options for \bison\ parsers suitable for \splint\ -have been discussed +has been discussed \ifbootstrapmode\else\locallink{bison.options}earlier \endlink\fi so we list them here without further comments. @= @@ -157,7 +166,7 @@ point of recognition, while the typesetting parser needs to be aware of them. @G %token TOP_OP POINTER_OP ARRAY_OP DEF_OP RE_DEF OPT_OTHER OPT_DEPRECATED -@ {\em \POSIX\ and \.{AT\&T} \lex\ place the +@ \namedspot{flex braces}{\em \POSIX\ and \.{AT\&T} \lex\ place the precedence of the repeat operator, \.{\{\}}, below that of concatenation. Thus, \.{ab\{3\}} is\/ \.{ababab}. Most other \POSIX\ utilities use an {\rm Extended Regular Expression (ERE)} precedence that has the repeat operator @@ -166,8 +175,8 @@ higher than concatenation. This causes \.{ab\{3\}} to yield\/ \.{abbb}. In order to support the \POSIX\ and \.{AT\&T} precedence and the \flex\ precedence we define two token sets for the begin and end tokens of the repeat operator, \prodstyle{BEGIN_REPEAT_POSIX} and\/ \prodstyle{END_REPEAT_POSIX}. The lexical scanner chooses -which tokens to return based on whether {\let\it\itbold\prodstyle{posix\_compat} or \prodstyle{lex\_compat} -are specified. Specifying either \prodstyle{posix\_compat} or \prodstyle{lex\_compat}} will +which tokens to return based on whether {\let\it\itbold\prodstyle{posix_compat} or \prodstyle{lex_compat} +are specified. Specifying either \prodstyle{posix_compat} or \prodstyle{lex_compat}} will cause \flex\ to parse scanner files as per the \.{AT\&T} and \POSIX-mandated behavior.} @= @G @@ -186,6 +195,7 @@ explanation). We can nevertheless get away with an empty \Cee\ preamble. @ @= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> @t}\vb{\inline\flatten}{@> goal: initlex sect1 sect1end @@ -202,12 +212,15 @@ initlex: @g @ @= - @[TeX_( "/yy0{/the/yy(2)/the/yy(4)}" );@]@; + @[TeX_( "/finishlist{/the/yy(4)}" );@]@; + @[TeX_( "/yy0{/the/yy(2)/nx/executelist{/the/yy(4)}}" );@]@; @ @= @@; @@; +@t}\endfoldedsections{@> + @ @= @G @t}\vb{\inline\flatten}{@> @@ -220,6 +233,7 @@ goal: @ @= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> sect1: sect1 startconddecl namelist1 {@> @ @=} | sect1 options {@> @ @=} @@ -266,8 +280,11 @@ namelist1: @ @= @[TeX_( "/yyerror" );@]@; +@t}\endfoldedsections{@> + @ @= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> options: OPTION_OP optionlist {@> @ @=} | POINTER_OP {@> @ @=} @@ -338,15 +355,19 @@ option: @ @= @[TeX_( "/yy0{/nx/flopt{deprecated}/the/yy(1)}" );@]@; +@t}\endfoldedsections{@> + @ @= @G +@t}\vb{\inline\flatten}{@> goal: sect2 {@> @ @=} ; @g @ @= - @[TeX_( "/table/yy(1)" );@]@; + @[TeX_( "/finishlist{/the/yy(1)}" );@]@; + @[TeX_( "/table/expandafter{/expandafter/executelist/expandafter{/the/yy(1)}}" );@]@; @ This portion of the grammar was changed to make it possible to read the action code. @@ -364,25 +385,54 @@ initforrule: ; @g -@ @= +@ The production below describes the most typical way a regular expression is +assigned an action. The redundant term \prodstyle{initforrule} is a standard +\bison\ trick to make sure that the appropriate initializations happen at +the right time. +\smallskip +\thisrulereference{\nx\inline\nx\flatten} +\smallskip\noindent +The original production has been modified so that the pretty printing parser has a chance +to consume the action code. The second \prodstyle{'\\n'} is output by the action +processing code. +@= @[TeX_( "/ifflcontinued@@action" );@]@; @[TeX_( " /toksb{/flactionc}" );@]@; @[TeX_( "/else" );@]@; @[TeX_( " /toksb{/flaction}" );@]@; @[TeX_( "/fi" );@]@; @[TeX_( "/toksa/expandafter{/astformat@@flaction}" );@]@; /* capture the formatting action */ - @[TeX_( "/yypushx{/the/yy(1)/the/toksb{/the/yy(2)}{/the/yy(4)}/the/yy(5)/the/yy(6){/the/toksa}}/on/astarray" );@]@; - @[TeX_( "/yy0{/astarraylastcs}" );@]@; + @[TeX_( "/yy0{/the/yy(1)}" );@]@; + @[TeX_( "/appendtolistx{/the/yy(1)}{/the/toksb{/the/yy(2)}{/the/yy(4)}/the/yy(5)/the/yy(6){/the/toksa}}" );@]@; @[TeX_( "/let/astformat@@flaction/empty" );@]@; /* reset the format */ -@ @= - @[TeX_( "/yy0{/the/yy(1)/nx/flactiongroup{/the/yy(2)}/the/yy(3){/the/yy(4)}/the/yy(5)}" );@]@; +@ For convenience, rules that are active in the same set of states may be grouped together. +This pattern is the subject of the next production. +\smallskip +\thisrulereference{\nx\inline\nx\flatten} +\smallskip\noindent +The original parser ignores the braces while the pretty printing parser +uses the pointers associated with the braces to collect and process the accumulated +stash. This is how comments and \CWEB\ section references are typeset. +@= + @[TeX_( "/yy0{/the/yy(1)}" );@]@; + @[TeX_( "/finishlist{/the/yy(4)}" );@]@; + @[TeX_( "/appendtolistx{/the/yy(1)}{/nx/flactiongroup{/the/yy(2)}/the/yy(3){/nx/executelist{/the/yy(4)}}/the/yy(5)}" );@]@; -@ @= - @[TeX_( "/yy0{}" );@]@; +@ Simple left recursive terms like~\prodstyle{sect2} are very suitable for being implemented as a list +(see the macros in \.{yycommon.sty} for the details on the list implementation). The `type' of~\prodstyle{sect2} +is a (symbolic pointer to a) list of items built up from an empty initial list. This production initializes +the list (with the name identical to the terminal on the left hand side of the production) +and updates the list name (rather the name's prefix) for future invocations of this action. + +@= + @[TeX_( "/initlist{/secttwoprefix sect2}" );@]@; + @[TeX_( "/yy0{/secttwoprefix sect2}" );@]@; + @[TeX_( "/edef/secttwoprefix{/secttwoprefix.}" );@]@; @ @= - @[TeX_( "/yy0{/the/yy(1)/nx/flbareaction/the/yy(2)}" );@]@; + @[TeX_( "/yy0{/the/yy(1)}" );@]@; + @[TeX_( "/appendtolistx{/the/yy(1)}{/nx/flbareaction/the/yy(2)}" );@]@; @ @= @G @@ -400,14 +450,23 @@ scon: namelist2: namelist2 ',' sconname {@> @ @=} | sconname {@> @ @=} - | error {@> @ @=} + | error {@> @ @=} ; @t}\vb{\inline\flatten}{@> sconname: NAME {@> @ @=} ; -@ @= +@ Start conditions are just names. The data structure that is output has +location pointers for the streams to enable interaction with \CWEB. These +pointers are in turn the values of the angle bracket tokens that enclose the +list of start conditions. + +Start condition lists may be collected in their own sections, while the list itself +may be followed by a comment. The pointers mentioned above are used to typeset the comments +and section references. +\beginfoldedsectionshere +@= @[TeX_( "/yy0{/nx/flsconlist{/the/yy(1)}{/the/yy(3)}{/the/yy(4)}}" );@]@; @ @= @@ -422,17 +481,24 @@ sconname: @ @= @@; -@ @= +@ @= @[TeX_( "/yyerror" );@]@; @ @= @[TeX_( "/yy0{/nx/flname/the/yy(1)}" );@]@; -@ @= +@t}\endfoldedsections{@> + +@*1 The syntax of regular expressions. The productions in this section define the +syntax of \flex\ regular expressions in detail. The same productions are used for +parsing isolated regular expressions (e.g.\ to present example code). A few of these +productions have been modified to suit the needs of the pretty printing parser. +@= @@; @ @= @G +@t}\vb{\inline\flatten}{@> goal: flexrule {@> @ @=} ; @@ -446,33 +512,48 @@ ensures that all the changes are local to the parsing macro. @= @[TeX_( "/table/yy(1)" );@]@; -@ @= +@ Regular expressions are parsed using the following productions. There are +two major cases: rules active only at the beginning of the line, and the rest. From the +typesetting parser's point of view, there is not much difference between the two +(certainly not enough to justify singling out the rules at the beginning of the line into +their own production) but it was decided to keep the original grammar rules +for consistency. +@= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> flexrule: - '^' rule {@> @ @=} + '^' rule {@> @ @=} | rule {@> @ @=} | EOF_OP {@> @ @=} | error {@> @ @=} ; -@ @= +@ @= @[TeX_( "/toksa/expandafter{/astformat@@flrule}" );@]@; @[TeX_( "/let/astformat@@flrule/empty" );@]@; @[TeX_( "/yy0{/nx/flbolrule{/the/yy(2)}{/the/toksa}}" );@]@; +@ @= + @[TeX_( "/yy0{/nx/fleof/the/yy(1)}" );@]@; + @ @= @[TeX_( "/toksa/expandafter{/astformat@@flrule}" );@]@; @[TeX_( "/let/astformat@@flrule/empty" );@]@; @[TeX_( "/yy0{/nx/flrule{/the/yy(1)}{/the/toksa}}" );@]@; -@ @= - @[TeX_( "/yy0{/nx/fleof/the/yy(1)}" );@]@; - @ @= @[TeX_( "/yyerror" );@]@; - -@ @= + +@t}\endfoldedsections{@> + +@ Another broad overview of regular expression types before diving into the details +of various operations. Note that the only trailing context that \splint\ output +lexer can process is the end of line (\prodstyle{'\$'}) due to the way the +scanner routine is written. It does not affect its ability to pretty print the appropriate +rules (for a lexer that is produced by \flex\ itself, for example). +@= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> rule: re2 re {@> @ @=} | re2 re '$' {@> @ @=} @@ -511,9 +592,22 @@ re2: @ @= @[TeX_( "/yy0{/nx/fltrail{/the/yy(1)}{/the/yy(2)}}" );@]@; + + @t}\endfoldedsections{@> -@ @= +@*2 Atoms. Every regular expression is assembled of atomic subexpressions, each +of which may be modified by an repetition operator that establishes how many +times a given pattern can repeat to stay part of the original atom. New atomic expressions +(or \prodstyle{singleton}s as they are called below) can be formed the usual way, by +enclosing a regular expression in parentheses. + +As explained \locallink{flex braces}above\endlink, braced repetition operators may +have different binding strengths, depending on the options supplied to \flex. The pretty +printing in both cases is identical as only the application scopes of the operator differ, and not +its meaning. +@= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> series: series singleton {@> @ @=} | singleton {@> @ @=} @@ -540,9 +634,12 @@ series: @ @= @@; - + +@t}\endfoldedsections{@> + @ @= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> singleton: singleton '*' {@> @ @=} | singleton '+' {@> @ @=} @@ -600,8 +697,15 @@ singleton: @ @= @[TeX_( "/yy0{/nx/flchar/the/yy(1)}" );@]@; -@ @= +@t}\endfoldedsections{@> + +@*2 Characters. Several facilities are available to specify sets of characters, including +built-in characters classes such as {\em whitespace}, {\em printable characters}, +{\em alphanumerics}, etc. Some simple boolean operaions are also supported to make specifying +character classes more efficient. +@= @G +@t}\vb{\insertraw{\beginfoldedsections}}{@> fullccl: fullccl CCL_OP_DIFF braceccl {@> @ @=} | fullccl CCL_OP_UNION braceccl {@> @ @=} @@ -610,7 +714,7 @@ fullccl: braceccl: '[' ccl ']' {@> @ @=} - | '[' '^' ccl ']' {@> @ @=} + | '[' '^' ccl ']' {@> @ @=} ; ccl: @@ -633,11 +737,13 @@ ccl: @ @= @[TeX_( "/yy0{/nx/flbraceccl{/the/yy(1)}{/the/yy(2)}{/the/yy(3)}}" );@]@; -@ @= - @[TeX_( "/yy0{/nx/flbracecclneg{/the/yy(1)}{/the/yy(3)}{/the/yy(4)}}" );@]@; +@ @= + @[TeXb( "/yy0{/nx/flbracecclneg" );@]@; + @[TeXfo( " {/the/yy(1)}{/the/yy(3)}{/the/yy(4)}}" );@]@; @ @= - @[TeX_( "/yy0{/the/yy(1)/nx/flcclrnge{/nx/flchar/the/yy(2)}{/nx/flchar/the/yy(4)}}" );@]@; + @[TeXb( "/yy0{/the/yy(1)/nx/flcclrnge" );@]@; + @[TeXfo( " {/nx/flchar/the/yy(2)}{/nx/flchar/the/yy(4)}}" );@]@; @ @= @[TeX_( "/yy0{/the/yy(1)/nx/flchar/the/yy(2)}" );@]@; @@ -648,7 +754,12 @@ ccl: @ @= @[TeX_( "/yy0{}" );@]@; -@ @= +@t}\endfoldedsections{@> + +@*3 Special character classes. Various character classes are predefined in \flex. +These include alphabetic and alphanumeric characters, digits, blank characters, upper and lower +case characters, etc. +@= @G ccl_expr: @t}\vb{\flatten}{@> @@ -696,7 +807,5 @@ string: @ @= @[TeX_( "/yy0{}" );@]@; -@ This is needed to get the |yytoknum| array. A trivial declaration suffices. +@ The postamble is empty for now. @= -#define YYPRINT(file, type, value) @[yyprint (file, type, value)@] - static void yyprint (FILE *file, int type, YYSTYPE value){} -- cgit v1.2.3