summaryrefslogtreecommitdiff
path: root/support/splint/examples/ld/ldlex.w
diff options
context:
space:
mode:
Diffstat (limited to 'support/splint/examples/ld/ldlex.w')
-rw-r--r--support/splint/examples/ld/ldlex.w519
1 files changed, 278 insertions, 241 deletions
diff --git a/support/splint/examples/ld/ldlex.w b/support/splint/examples/ld/ldlex.w
index 2312fd1027..0add0b0294 100644
--- a/support/splint/examples/ld/ldlex.w
+++ b/support/splint/examples/ld/ldlex.w
@@ -1,4 +1,4 @@
-@q Copyright 2012-2020 Alexander Shibakov@>
+@q Copyright 2012-2022 Alexander Shibakov@>
@q Copyright 2002-2014 Free Software Foundation, Inc.@>
@q This file is part of SPLinT@>
@@ -17,10 +17,10 @@
@** The lexer.
\ifbootstrapmode
- \input ldman.sty
- \modebootstrap
- \input dcols.sty
- \setupfootnotes
+ \input limbo.sty
+ \input yystype.sty
+ \input grabstates.sty
+ \immediate\openout\stlist=ldl_states.h
\def\MRI{}
\def\ld{}
\fi
@@ -37,7 +37,7 @@ the \bison\ parser which is part of this distribution.
%{@> @<\ld\ lexer \Cee\ preamble@> @=%}
@> @<\ld\ lexer options@> @=
%%
- @> @<\ld\ token regular expressions@> @=
+ @> @<Regular expressions for \ld\ tokens@> @=
%%
@O
void define_all_states( void ) {
@@ -47,7 +47,7 @@ void define_all_states( void ) {
@g
@ @<\ld\ lexer options@>=
-@G
+@G(fs1)
%option bison-bridge
%option noyywrap nounput noinput reentrant
%option noyy_top_state
@@ -57,10 +57,10 @@ void define_all_states( void ) {
@g
@ @<\ld\ lexer \Cee\ preamble@>=
-#include <stdint.h>
-#include <stdbool.h>
-@ @<Collect state definitions for the \ld\ lexer@>=
+@ The file \.{ldl\_states.h} below contains the names of all the start
+conditions@^start conditions@> (or states) collected by the bootstrap parser.
+@<Collect state definitions for the \ld\ lexer@>=
#define _register_name( name ) @[Define_State( #name, name )@]
#include "ldl_states.h"
#undef _register_name
@@ -94,7 +94,7 @@ same section simplifies the job of the
\locallink{bootstrapstates}bootstrap parser\endlink, as well.
\ifbootstrapmode\immediate\openout\stlist=ldl_states.h\fi
@<\ld\ lexer states@>=
-@G
+@G(fs1)
%s SCRIPT
%s EXPRESSION
%s BOTH
@@ -117,8 +117,9 @@ function. The typesetting parser uses the \.{\\ldcomment} macro for
the same purpose. For the curious, here is a \flex\ style regular
expression defining \Cee\ comments\footnote{Taken from W.~McKeeman's site
at
-\url{http://www.cs.dartmouth.edu/~mckeeman/cs118/assignments/comment.html}
-and adapted to \flex\ syntax.}:
+\url{http://www.cs.dartmouth.edu/~mckeeman/cs118/assignments/comment.html} and
+adapted to \flex\ syntax. Here is the same regular expression pretty printed by
+\splint: \flexrestyle{"/*"("/"`[\^*/]`"*"+[\^*/])*"*"+"/"}}:
$$
\hbox{\.{"/*" ("/"\yl[\^*/]\yl"*"+[\^*/])* "*"+ "/"}}
$$
@@ -193,6 +194,15 @@ possible, however, if \.{\\yylextail} is not used inside actions (in the case of
an `optimized' lexer the restriction is even weaker, namely,
\.{\\yylextail} merely has to be absent in the portion of the action
following \.{\\ldcomment}).
+
+Another remark might be in order. It would seem more appropriate to
+employ \TeX's native grouping mechanism to avoid the side effects
+casued by the assignments performed by the macros (such as
+\.{\\let\\oldyyreturn\\yyreturn}). While this is possible with some
+careful macro writing, a na\:\i ve grouping attempt would interfere
+with the assignments performed by \.{\\yymatch}
+(e.g.~\.{\\yyresetstreams}). Avoiding assignments like these is still
+possible although the effort required is bordering on excessive.
@<Additional macros for the \ld\ lexer/parser@>=
@G(t)
\def\ldcomment#1\yylextail{%
@@ -221,14 +231,24 @@ We would like to simulate the file inclusion by inserting the
appropriate end of file marker for the lexer (a double
\.{\\yyeof}). After the relevant production completes, the marker
has to be cleaned up from the input stream (the lexer is designed to
-leave it intact). The macros below are designed to handle this assignment.
+leave it intact to be able to read the end of file multiple times
+while looking for the longest match).
+
+The macro below is designed to handle this task. The idea is to replace
+the double \.{\\yyeof} at the beginning of the input with an appropriate
+lexer action. The \.{\\yyreadinput} handles the input buffer and inserts the
+tail portion of the current \flex\ action in front of it.
@<Additional macros for the \ld\ lexer/parser@>=
@G(t)
\def\ldcleanyyeof#1\yylextail{%
- \let\oldyyinput\yyinput
- \def\yyinput\yyeof\yyeof{\let\yyinput\oldyyinput#1\yylextail}%
- \yymatch
+ \yyreadinput{\ldcl@@anyyeof{#1\yylextail}}{\romannumeral0\yyr@@@@dinput}%
+}
+
+\def\ldcl@@anyyeof#1#2#3{%
+ #3\ldcl@@anyye@@f{#1}#2%
}
+
+\def\ldcl@@anyye@@f#1#2\yyeof\yyeof{#1}
@g
@*1 Regular expressions.
@@ -237,204 +257,166 @@ describe the {\it tokens\/} of the appropriate language. The variey of
tokens recognized by \ld\ is quite extensive and is described in the
sections that follow.
-Variable names and algebraic operations come first.
-@<\ld\ token regular expressions@>=
+Variable names, constants, and algebraic operations come first.
+@<Regular expressions for \ld\ tokens@>=
@G(fs2)
-<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" {@> @[TeX_( "/ldcomment/yylexnext" );@]@=}
-<DEFSYMEXP>"-" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<DEFSYMEXP>"+" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
-<DEFSYMEXP>"=" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {@> @<Return an absolute hex constant@> @=}
-<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {@> @<Return a constant in a specific radix@>@=}
-<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
- @> @<Return a constant with a multiplier@>@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"]" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"[" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" {@> @[TeX_( "/yylexreturnptr{LSHIFTEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>">>=" {@> @[TeX_( "/yylexreturnptr{RSHIFTEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"||" {@> @[TeX_( "/yylexreturnptr{OROR}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"==" {@> @[TeX_( "/yylexreturnptr{EQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"!=" {@> @[TeX_( "/yylexreturnptr{NE}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>">=" {@> @[TeX_( "/yylexreturnptr{GE}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"<=" {@> @[TeX_( "/yylexreturnptr{LE}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"<<" {@> @[TeX_( "/yylexreturnptr{LSHIFT}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>">>" {@> @[TeX_( "/yylexreturnptr{RSHIFT}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"+=" {@> @[TeX_( "/yylexreturnptr{PLUSEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"-=" {@> @[TeX_( "/yylexreturnptr{MINUSEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"*=" {@> @[TeX_( "/yylexreturnptr{MULTEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"/=" {@> @[TeX_( "/yylexreturnptr{DIVEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"&=" {@> @[TeX_( "/yylexreturnptr{ANDEQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"|=" {@> @[TeX_( "/yylexreturnptr{OREQ}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"&&" {@> @[TeX_( "/yylexreturnptr{ANDAND}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>">" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"," {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"&" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"|" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"~" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"!" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"?" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"*" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"+" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"-" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"/" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"%" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"<" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"=" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"}" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"{" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>")" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>"(" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>":" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<BOTH,SCRIPT,EXPRESSION,MRI>";" {@> @[TeX_( "/yylexreturnchar" );@]@=}
+<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>{
+ "/*" {@> @[TeX_( "/ldcomment/yylexnext" );@]@=}
+}
+
+<DEFSYMEXP>{
+ "-" {@> @[TeX_( "/yylexreturnchar" );@]@=}
+ "+" {@> @[TeX_( "/yylexreturnchar" );@]@=}
+ {FILENAMECHAR1}{SYMBOLCHARN}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+ "=" {@> @[TeX_( "/yylexreturnchar" );@]@=}
+}
+
+<MRI,EXPRESSION>{
+ "$"([0-9A-Fa-f])+ {@> @<Return an absolute hex constant@> @=}
+ ([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {@> @<Return a constant in a specific radix@>@=}
+}
+
+<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>{
+ ((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {@> @<Return a constant with a multiplier@>@=}
+}
+
+<BOTH,SCRIPT,EXPRESSION,MRI>{
+ "<<=" {@> @[TeX_( "/yylexreturnptr{LSHIFTEQ}" );@]@=}
+ ">>=" {@> @[TeX_( "/yylexreturnptr{RSHIFTEQ}" );@]@=}
+ "||" {@> @[TeX_( "/yylexreturnptr{OROR}" );@]@=}
+ "==" {@> @[TeX_( "/yylexreturnptr{EQ}" );@]@=}
+ "!=" {@> @[TeX_( "/yylexreturnptr{NE}" );@]@=}
+ ">=" {@> @[TeX_( "/yylexreturnptr{GE}" );@]@=}
+ "<=" {@> @[TeX_( "/yylexreturnptr{LE}" );@]@=}
+ "<<" {@> @[TeX_( "/yylexreturnptr{LSHIFT}" );@]@=}
+ ">>" {@> @[TeX_( "/yylexreturnptr{RSHIFT}" );@]@=}
+ "+=" {@> @[TeX_( "/yylexreturnptr{PLUSEQ}" );@]@=}
+ "-=" {@> @[TeX_( "/yylexreturnptr{MINUSEQ}" );@]@=}
+ "*=" {@> @[TeX_( "/yylexreturnptr{MULTEQ}" );@]@=}
+ "/=" {@> @[TeX_( "/yylexreturnptr{DIVEQ}" );@]@=}
+ "&=" {@> @[TeX_( "/yylexreturnptr{ANDEQ}" );@]@=}
+ "|=" {@> @[TeX_( "/yylexreturnptr{OREQ}" );@]@=}
+ "&&" {@> @[TeX_( "/yylexreturnptr{ANDAND}" );@]@=}
+ [&|~!?*+\-/%=<>{}()\[\]:;,] {@> @[TeX_( "/yylexreturnchar" );@]@=}
+}
@g
@ The bulk of tokens produced by the lexer are the keywords used
inside script files. File name syntax is listed as well, along with
-miscellanea such as whitespace and version symbols.
-@<\ld\ token regular expressions@>=
+the miscellanea like whitespace and version symbols.
+@<Regular expressions for \ld\ tokens@>=
@G(fs2)
-<BOTH,SCRIPT>"MEMORY" {@> @[TeX_( "/yylexreturnptr{MEMORY}" );@]@=}
-<BOTH,SCRIPT>"REGION_ALIAS" {@> @[TeX_( "/yylexreturnptr{REGION_ALIAS}" );@]@=}
-<BOTH,SCRIPT>"LD_FEATURE" {@> @[TeX_( "/yylexreturnptr{LD_FEATURE}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION>"ORIGIN" {@> @[TeX_( "/yylexreturnptr{ORIGIN}" );@]@=}
-<BOTH,SCRIPT>"VERSION" {@> @[TeX_( "/yylexreturnptr{VERSIONK}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"BLOCK" {@> @[TeX_( "/yylexreturnptr{BLOCK}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"BIND" {@> @[TeX_( "/yylexreturnptr{BIND}" );@]@=}
-<BOTH,SCRIPT,EXPRESSION>"LENGTH" {@> @[TeX_( "/yylexreturnptr{LENGTH}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ALIGN" {@> @[TeX_( "/yylexreturnptr{ALIGN_K}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" {@> @[TeX_( "/yylexreturnptr{DATA_SEGMENT_ALIGN}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" {@> @[TeX_( "/yylexreturnptr{DATA_SEGMENT_RELRO_END}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" {@> @[TeX_( "/yylexreturnptr{DATA_SEGMENT_END}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ADDR" {@> @[TeX_( "/yylexreturnptr{ADDR}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"LOADADDR" {@> @[TeX_( "/yylexreturnptr{LOADADDR}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" {@> @[TeX_( "/yylexreturnptr{ALIGNOF}" );@]@=}
-<EXPRESSION,BOTH>"MAX" {@> @[TeX_( "/yylexreturnptr{MAX_K}" );@]@=}
-<EXPRESSION,BOTH>"MIN" {@> @[TeX_( "/yylexreturnptr{MIN_K}" );@]@=}
-<EXPRESSION,BOTH>"LOG2CEIL" {@> @[TeX_( "/yylexreturnptr{LOG2CEIL}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ASSERT" {@> @[TeX_( "/yylexreturnptr{ASSERT_K}" );@]@=}
-<BOTH,SCRIPT>"ENTRY" {@> @[TeX_( "/yylexreturnptr{ENTRY}" );@]@=}
-<BOTH,SCRIPT,MRI>"EXTERN" {@> @[TeX_( "/yylexreturnptr{EXTERN}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"NEXT" {@> @[TeX_( "/yylexreturnptr{NEXT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" {@> @[TeX_( "/yylexreturnptr{SIZEOF_HEADERS}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" {@> @[TeX_( "/yylexreturnptr{SIZEOF_HEADERS}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" {@> @[TeX_( "/yylexreturnptr{SEGMENT_START}" );@]@=}
-<BOTH,SCRIPT>"MAP" {@> @[TeX_( "/yylexreturnptr{MAP}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"SIZEOF" {@> @[TeX_( "/yylexreturnptr{SIZEOF}" );@]@=}
-<BOTH,SCRIPT>"TARGET" {@> @[TeX_( "/yylexreturnptr{TARGET_K}" );@]@=}
-<BOTH,SCRIPT>"SEARCH_DIR" {@> @[TeX_( "/yylexreturnptr{SEARCH_DIR}" );@]@=}
-<BOTH,SCRIPT>"OUTPUT" {@> @[TeX_( "/yylexreturnptr{OUTPUT}" );@]@=}
-<BOTH,SCRIPT>"INPUT" {@> @[TeX_( "/yylexreturnptr{INPUT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"GROUP" {@> @[TeX_( "/yylexreturnptr{GROUP}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" {@> @[TeX_( "/yylexreturnptr{AS_NEEDED}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"DEFINED" {@> @[TeX_( "/yylexreturnptr{DEFINED}" );@]@=}
-<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" {@> @[TeX_( "/yylexreturnptr{CREATE_OBJECT_SYMBOLS}" );@]@=}
-<BOTH,SCRIPT>"CONSTRUCTORS" {@> @[TeX_( "/yylexreturnptr{CONSTRUCTORS}" );@]@=}
-<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" {@> @[TeX_( "/yylexreturnptr{FORCE_COMMON_ALLOCATION}" );@]@=}
-<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" {@> @[TeX_( "/yylexreturnptr{INHIBIT_COMMON_ALLOCATION}" );@]@=}
-<BOTH,SCRIPT>"SECTIONS" {@> @[TeX_( "/yylexreturnptr{SECTIONS}" );@]@=}
-<BOTH,SCRIPT>"INSERT" {@> @[TeX_( "/yylexreturnptr{INSERT_K}" );@]@=}
-<BOTH,SCRIPT>"AFTER" {@> @[TeX_( "/yylexreturnptr{AFTER}" );@]@=}
-<BOTH,SCRIPT>"BEFORE" {@> @[TeX_( "/yylexreturnptr{BEFORE}" );@]@=}
-<BOTH,SCRIPT>"FILL" {@> @[TeX_( "/yylexreturnptr{FILL}" );@]@=}
-<BOTH,SCRIPT>"STARTUP" {@> @[TeX_( "/yylexreturnptr{STARTUP}" );@]@=}
-<BOTH,SCRIPT>"OUTPUT_FORMAT" {@> @[TeX_( "/yylexreturnptr{OUTPUT_FORMAT}" );@]@=}
-<BOTH,SCRIPT>"OUTPUT_ARCH" {@> @[TeX_( "/yylexreturnptr{OUTPUT_ARCH}" );@]@=}
-<BOTH,SCRIPT>"HLL" {@> @[TeX_( "/yylexreturnptr{HLL}" );@]@=}
-<BOTH,SCRIPT>"SYSLIB" {@> @[TeX_( "/yylexreturnptr{SYSLIB}" );@]@=}
-<BOTH,SCRIPT>"FLOAT" {@> @[TeX_( "/yylexreturnptr{FLOAT}" );@]@=}
-<BOTH,SCRIPT>"QUAD" {@> @[TeX_( "/yylexreturnptr{QUAD}" );@]@=}
-<BOTH,SCRIPT>"SQUAD" {@> @[TeX_( "/yylexreturnptr{SQUAD}" );@]@=}
-<BOTH,SCRIPT>"LONG" {@> @[TeX_( "/yylexreturnptr{LONG}" );@]@=}
-<BOTH,SCRIPT>"SHORT" {@> @[TeX_( "/yylexreturnptr{SHORT}" );@]@=}
-<BOTH,SCRIPT>"BYTE" {@> @[TeX_( "/yylexreturnptr{BYTE}" );@]@=}
-<BOTH,SCRIPT>"NOFLOAT" {@> @[TeX_( "/yylexreturnptr{NOFLOAT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" {@> @[TeX_( "/yylexreturnptr{NOCROSSREFS}" );@]@=}
-<BOTH,SCRIPT>"OVERLAY" {@> @[TeX_( "/yylexreturnptr{OVERLAY}" );@]@=}
-<BOTH,SCRIPT>"SORT_BY_NAME" {@> @[TeX_( "/yylexreturnptr{SORT_BY_NAME}" );@]@=}
-<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" {@> @[TeX_( "/yylexreturnptr{SORT_BY_ALIGNMENT}" );@]@=}
-<BOTH,SCRIPT>"SORT" {@> @[TeX_( "/yylexreturnptr{SORT_BY_NAME}" );@]@=}
-<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" {@> @[TeX_( "/yylexreturnptr{SORT_BY_INIT_PRIORITY}" );@]@=}
-<BOTH,SCRIPT>"SORT_NONE" {@> @[TeX_( "/yylexreturnptr{SORT_NONE}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"NOLOAD" {@> @[TeX_( "/yylexreturnptr{NOLOAD}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"DSECT" {@> @[TeX_( "/yylexreturnptr{DSECT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"COPY" {@> @[TeX_( "/yylexreturnptr{COPY}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"INFO" {@> @[TeX_( "/yylexreturnptr{INFO}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"OVERLAY" {@> @[TeX_( "/yylexreturnptr{OVERLAY}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" {@> @[TeX_( "/yylexreturnptr{ONLY_IF_RO}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" {@> @[TeX_( "/yylexreturnptr{ONLY_IF_RW}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"SPECIAL" {@> @[TeX_( "/yylexreturnptr{SPECIAL}" );@]@=}
-<BOTH,SCRIPT>"o" {@> @[TeX_( "/yylexreturnptr{ORIGIN}" );@]@=}
-<BOTH,SCRIPT>"org" {@> @[TeX_( "/yylexreturnptr{ORIGIN}" );@]@=}
-<BOTH,SCRIPT>"l" {@> @[TeX_( "/yylexreturnptr{LENGTH}" );@]@=}
-<BOTH,SCRIPT>"len" {@> @[TeX_( "/yylexreturnptr{LENGTH}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS" {@> @[TeX_( "/yylexreturnptr{INPUT_SECTION_FLAGS}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"INCLUDE" {@> @[TeX_( "/yylexreturnptr{INCLUDE}" );@]@=}
-<BOTH,SCRIPT>"PHDRS" {@> @[TeX_( "/yylexreturnptr{PHDRS}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"AT" {@> @[TeX_( "/yylexreturnptr{AT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"ALIGN_WITH_INPUT" {@> @[TeX_( "/yylexreturnptr{ALIGN_WITH_INPUT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" {@> @[TeX_( "/yylexreturnptr{SUBALIGN}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"HIDDEN" {@> @[TeX_( "/yylexreturnptr{HIDDEN}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"PROVIDE" {@> @[TeX_( "/yylexreturnptr{PROVIDE}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" {@> @[TeX_( "/yylexreturnptr{PROVIDE_HIDDEN}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"KEEP" {@> @[TeX_( "/yylexreturnptr{KEEP}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" {@> @[TeX_( "/yylexreturnptr{EXCLUDE_FILE}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT>"CONSTANT" {@> @[TeX_( "/yylexreturnptr{CONSTANT}" );@]@=}
-<MRI>"#".*\n? {@> @[TeX_( "/yylexnext" );@]@=}
-<MRI>"\n" {@> @[TeX_( "/yylexreturnptr{NEWLINE}" );@]@=}
-<MRI>"*".* {@> @[TeX_( "/yylexnext" );@]@=}
-<MRI>";".* {@> @[TeX_( "/yylexnext" );@]@=}
-<MRI>"END" {@> @[TeX_( "/yylexreturnptr{ENDWORD}" );@]@=}
-<MRI>"ALIGNMOD" {@> @[TeX_( "/yylexreturnptr{ALIGNMOD}" );@]@=}
-<MRI>"ALIGN" {@> @[TeX_( "/yylexreturnptr{ALIGN_K}" );@]@=}
-<MRI>"CHIP" {@> @[TeX_( "/yylexreturnptr{CHIP}" );@]@=}
-<MRI>"BASE" {@> @[TeX_( "/yylexreturnptr{BASE}" );@]@=}
-<MRI>"ALIAS" {@> @[TeX_( "/yylexreturnptr{ALIAS}" );@]@=}
-<MRI>"TRUNCATE" {@> @[TeX_( "/yylexreturnptr{TRUNCATE}" );@]@=}
-<MRI>"LOAD" {@> @[TeX_( "/yylexreturnptr{LOAD}" );@]@=}
-<MRI>"PUBLIC" {@> @[TeX_( "/yylexreturnptr{PUBLIC}" );@]@=}
-<MRI>"ORDER" {@> @[TeX_( "/yylexreturnptr{ORDER}" );@]@=}
-<MRI>"NAME" {@> @[TeX_( "/yylexreturnptr{NAMEWORD}" );@]@=}
-<MRI>"FORMAT" {@> @[TeX_( "/yylexreturnptr{FORMAT}" );@]@=}
-<MRI>"CASE" {@> @[TeX_( "/yylexreturnptr{CASE}" );@]@=}
-<MRI>"START" {@> @[TeX_( "/yylexreturnptr{START}" );@]@=}
-<MRI>"LIST".* {@> @[TeX_( "/yylexreturnptr{LIST}" );@]@=}
-<MRI>"SECT" {@> @[TeX_( "/yylexreturnptr{SECT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" {@> @[TeX_( "/yylexreturnptr{ABSOLUTE}" );@]@=}
-<MRI>"end" {@> @[TeX_( "/yylexreturnptr{ENDWORD}" );@]@=}
-<MRI>"alignmod" {@> @[TeX_( "/yylexreturnptr{ALIGNMOD}" );@]@=}
-<MRI>"align" {@> @[TeX_( "/yylexreturnptr{ALIGN_K}" );@]@=}
-<MRI>"chip" {@> @[TeX_( "/yylexreturnptr{CHIP}" );@]@=}
-<MRI>"base" {@> @[TeX_( "/yylexreturnptr{BASE}" );@]@=}
-<MRI>"alias" {@> @[TeX_( "/yylexreturnptr{ALIAS}" );@]@=}
-<MRI>"truncate" {@> @[TeX_( "/yylexreturnptr{TRUNCATE}" );@]@=}
-<MRI>"load" {@> @[TeX_( "/yylexreturnptr{LOAD}" );@]@=}
-<MRI>"public" {@> @[TeX_( "/yylexreturnptr{PUBLIC}" );@]@=}
-<MRI>"order" {@> @[TeX_( "/yylexreturnptr{ORDER}" );@]@=}
-<MRI>"name" {@> @[TeX_( "/yylexreturnptr{NAMEWORD}" );@]@=}
-<MRI>"format" {@> @[TeX_( "/yylexreturnptr{FORMAT}" );@]@=}
-<MRI>"case" {@> @[TeX_( "/yylexreturnptr{CASE}" );@]@=}
-<MRI>"extern" {@> @[TeX_( "/yylexreturnptr{EXTERN}" );@]@=}
-<MRI>"start" {@> @[TeX_( "/yylexreturnptr{START}" );@]@=}
-<MRI>"list".* {@> @[TeX_( "/yylexreturnptr{LIST}" );@]@=}
-<MRI>"sect" {@> @[TeX_( "/yylexreturnptr{SECT}" );@]@=}
-<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" {@> @[TeX_( "/yylexreturnptr{ABSOLUTE}" );@]@=}
-<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
-<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
-<BOTH>"-l"{FILENAMECHAR}+ {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
-<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
-<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+<BOTH,SCRIPT>{
+ "MEMORY" {@> @[TeX_( "/yylexreturnptr{MEMORY}" );@]@=}
+ "REGION_ALIAS" {@> @[TeX_( "/yylexreturnptr{REGION_ALIAS}" );@]@=}
+ "LD_FEATURE" {@> @[TeX_( "/yylexreturnptr{LD_FEATURE}" );@]@=}
+ "VERSION" {@> @[TeX_( "/yylexreturnptr{VERSIONK}" );@]@=}
+ "TARGET" {@> @[TeX_( "/yylexreturnptr{TARGET_K}" );@]@=}
+ "SEARCH_DIR" {@> @[TeX_( "/yylexreturnptr{SEARCH_DIR}" );@]@=}
+ "OUTPUT" {@> @[TeX_( "/yylexreturnptr{OUTPUT}" );@]@=}
+ "INPUT" {@> @[TeX_( "/yylexreturnptr{INPUT}" );@]@=}
+ "ENTRY" {@> @[TeX_( "/yylexreturnptr{ENTRY}" );@]@=}
+ "MAP" {@> @[TeX_( "/yylexreturnptr{MAP}" );@]@=}
+ "CREATE_OBJECT_SYMBOLS" {@> @[TeX_( "/yylexreturnptr{CREATE_OBJECT_SYMBOLS}" );@]@=}
+ "CONSTRUCTORS" {@> @[TeX_( "/yylexreturnptr{CONSTRUCTORS}" );@]@=}
+ "FORCE_COMMON_ALLOCATION" {@> @[TeX_( "/yylexreturnptr{FORCE_COMMON_ALLOCATION}" );@]@=}
+ "INHIBIT_COMMON_ALLOCATION" {@> @[TeX_( "/yylexreturnptr{INHIBIT_COMMON_ALLOCATION}" );@]@=}
+ "SECTIONS" {@> @[TeX_( "/yylexreturnptr{SECTIONS}" );@]@=}
+ "INSERT" {@> @[TeX_( "/yylexreturnptr{INSERT_K}" );@]@=}
+ "AFTER" {@> @[TeX_( "/yylexreturnptr{AFTER}" );@]@=}
+ "BEFORE" {@> @[TeX_( "/yylexreturnptr{BEFORE}" );@]@=}
+ "FILL" {@> @[TeX_( "/yylexreturnptr{FILL}" );@]@=}
+ "STARTUP" {@> @[TeX_( "/yylexreturnptr{STARTUP}" );@]@=}
+ "OUTPUT_FORMAT" {@> @[TeX_( "/yylexreturnptr{OUTPUT_FORMAT}" );@]@=}
+ "OUTPUT_ARCH" {@> @[TeX_( "/yylexreturnptr{OUTPUT_ARCH}" );@]@=}
+ "HLL" {@> @[TeX_( "/yylexreturnptr{HLL}" );@]@=}
+ "SYSLIB" {@> @[TeX_( "/yylexreturnptr{SYSLIB}" );@]@=}
+ "FLOAT" {@> @[TeX_( "/yylexreturnptr{FLOAT}" );@]@=}
+ "QUAD" {@> @[TeX_( "/yylexreturnptr{QUAD}" );@]@=}
+ "SQUAD" {@> @[TeX_( "/yylexreturnptr{SQUAD}" );@]@=}
+ "LONG" {@> @[TeX_( "/yylexreturnptr{LONG}" );@]@=}
+ "SHORT" {@> @[TeX_( "/yylexreturnptr{SHORT}" );@]@=}
+ "BYTE" {@> @[TeX_( "/yylexreturnptr{BYTE}" );@]@=}
+ "NOFLOAT" {@> @[TeX_( "/yylexreturnptr{NOFLOAT}" );@]@=}
+ "OVERLAY" {@> @[TeX_( "/yylexreturnptr{OVERLAY}" );@]@=}
+ "SORT_BY_NAME" {@> @[TeX_( "/yylexreturnptr{SORT_BY_NAME}" );@]@=}
+ "SORT_BY_ALIGNMENT" {@> @[TeX_( "/yylexreturnptr{SORT_BY_ALIGNMENT}" );@]@=}
+ "SORT" {@> @[TeX_( "/yylexreturnptr{SORT_BY_NAME}" );@]@=}
+ "SORT_BY_INIT_PRIORITY" {@> @[TeX_( "/yylexreturnptr{SORT_BY_INIT_PRIORITY}" );@]@=}
+ "SORT_NONE" {@> @[TeX_( "/yylexreturnptr{SORT_NONE}" );@]@=}
+ "EXTERN" {@> @[TeX_( "/yylexreturnptr{EXTERN}" );@]@=}
+ "o"|"org" {@> @[TeX_( "/yylexreturnptr{ORIGIN}" );@]@=}
+ "l"|"len" {@> @[TeX_( "/yylexreturnptr{LENGTH}" );@]@=}
+ "PHDRS" {@> @[TeX_( "/yylexreturnptr{PHDRS}" );@]@=}
+}
+
+<EXPRESSION,BOTH,SCRIPT>{
+ "BLOCK" {@> @[TeX_( "/yylexreturnptr{BLOCK}" );@]@=}
+ "BIND" {@> @[TeX_( "/yylexreturnptr{BIND}" );@]@=}
+ "LENGTH" {@> @[TeX_( "/yylexreturnptr{LENGTH}" );@]@=}
+ "ORIGIN" {@> @[TeX_( "/yylexreturnptr{ORIGIN}" );@]@=}
+ "ALIGN" {@> @[TeX_( "/yylexreturnptr{ALIGN_K}" );@]@=}
+ "DATA_SEGMENT_ALIGN" {@> @[TeX_( "/yylexreturnptr{DATA_SEGMENT_ALIGN}" );@]@=}
+ "DATA_SEGMENT_RELRO_END" {@> @[TeX_( "/yylexreturnptr{DATA_SEGMENT_RELRO_END}" );@]@=}
+ "DATA_SEGMENT_END" {@> @[TeX_( "/yylexreturnptr{DATA_SEGMENT_END}" );@]@=}
+ "ADDR" {@> @[TeX_( "/yylexreturnptr{ADDR}" );@]@=}
+ "LOADADDR" {@> @[TeX_( "/yylexreturnptr{LOADADDR}" );@]@=}
+ "ALIGNOF" {@> @[TeX_( "/yylexreturnptr{ALIGNOF}" );@]@=}
+ "ASSERT" {@> @[TeX_( "/yylexreturnptr{ASSERT_K}" );@]@=}
+ "NEXT" {@> @[TeX_( "/yylexreturnptr{NEXT}" );@]@=}
+ "sizeof_headers" {@> @[TeX_( "/yylexreturnptr{SIZEOF_HEADERS}" );@]@=}
+ "SIZEOF_HEADERS" {@> @[TeX_( "/yylexreturnptr{SIZEOF_HEADERS}" );@]@=}
+ "SEGMENT_START" {@> @[TeX_( "/yylexreturnptr{SEGMENT_START}" );@]@=}
+ "SIZEOF" {@> @[TeX_( "/yylexreturnptr{SIZEOF}" );@]@=}
+ "GROUP" {@> @[TeX_( "/yylexreturnptr{GROUP}" );@]@=}
+ "AS_NEEDED" {@> @[TeX_( "/yylexreturnptr{AS_NEEDED}" );@]@=}
+ "DEFINED" {@> @[TeX_( "/yylexreturnptr{DEFINED}" );@]@=}
+ "NOCROSSREFS" {@> @[TeX_( "/yylexreturnptr{NOCROSSREFS}" );@]@=}
+ "NOLOAD" {@> @[TeX_( "/yylexreturnptr{NOLOAD}" );@]@=}
+ "DSECT" {@> @[TeX_( "/yylexreturnptr{DSECT}" );@]@=}
+ "COPY" {@> @[TeX_( "/yylexreturnptr{COPY}" );@]@=}
+ "INFO" {@> @[TeX_( "/yylexreturnptr{INFO}" );@]@=}
+ "OVERLAY" {@> @[TeX_( "/yylexreturnptr{OVERLAY}" );@]@=}
+ "ONLY_IF_RO" {@> @[TeX_( "/yylexreturnptr{ONLY_IF_RO}" );@]@=}
+ "ONLY_IF_RW" {@> @[TeX_( "/yylexreturnptr{ONLY_IF_RW}" );@]@=}
+ "SPECIAL" {@> @[TeX_( "/yylexreturnptr{SPECIAL}" );@]@=}
+ "INPUT_SECTION_FLAGS" {@> @[TeX_( "/yylexreturnptr{INPUT_SECTION_FLAGS}" );@]@=}
+ "INCLUDE" {@> @[TeX_( "/yylexreturnptr{INCLUDE}" );@]@=}
+ "AT" {@> @[TeX_( "/yylexreturnptr{AT}" );@]@=}
+ "ALIGN_WITH_INPUT" {@> @[TeX_( "/yylexreturnptr{ALIGN_WITH_INPUT}" );@]@=}
+ "SUBALIGN" {@> @[TeX_( "/yylexreturnptr{SUBALIGN}" );@]@=}
+ "HIDDEN" {@> @[TeX_( "/yylexreturnptr{HIDDEN}" );@]@=}
+ "PROVIDE" {@> @[TeX_( "/yylexreturnptr{PROVIDE}" );@]@=}
+ "PROVIDE_HIDDEN" {@> @[TeX_( "/yylexreturnptr{PROVIDE_HIDDEN}" );@]@=}
+ "KEEP" {@> @[TeX_( "/yylexreturnptr{KEEP}" );@]@=}
+ "EXCLUDE_FILE" {@> @[TeX_( "/yylexreturnptr{EXCLUDE_FILE}" );@]@=}
+ "CONSTANT" {@> @[TeX_( "/yylexreturnptr{CONSTANT}" );@]@=}
+ "\n" {@> @[TeX_( "/yylexnext" );@]@=}
+}
+
+<EXPRESSION,BOTH>{
+ "MAX" {@> @[TeX_( "/yylexreturnptr{MAX_K}" );@]@=}
+ "MIN" {@> @[TeX_( "/yylexreturnptr{MIN_K}" );@]@=}
+ "LOG2CEIL" {@> @[TeX_( "/yylexreturnptr{LOG2CEIL}" );@]@=}
+}
+
+<EXPRESSION,BOTH,SCRIPT,MRI>{
+ "ABSOLUTE"|"absolute" {@> @[TeX_( "/yylexreturnptr{ABSOLUTE}" );@]@=}
+ [ \t\r]+ {@> @[TeX_( "/yylexnext" );@]@=}
+}
+
+<BOTH>{
+ {FILENAMECHAR1}{FILENAMECHAR}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+ "-l"{FILENAMECHAR}+ {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+}
+
+<EXPRESSION>{
+ {FILENAMECHAR1}{NOCFILENAMECHAR}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+ "-l"{NOCFILENAMECHAR}+ {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+}
+
<SCRIPT>{WILDCHAR}* {@> @[@<Skip a possible comment and return a \prodstyle{NAME}@>@]@=}
<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {@> @[@<Return the \prodstyle{NAME} inside quotes@>@]@=}
-<BOTH,SCRIPT,EXPRESSION>"\n" {@> @[TeX_( "/yylexnext" );@]@=}
-<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ {@> @[TeX_( "/yylexnext" );@]@=}
-<VERS_NODE,VERS_SCRIPT>[:,;] {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<VERS_NODE>global {@> @[TeX_( "/yylexreturnptr{GLOBAL}" );@]@=}
-<VERS_NODE>local {@> @[TeX_( "/yylexreturnptr{LOCAL}" );@]@=}
-<VERS_NODE>extern {@> @[TeX_( "/yylexreturnptr{EXTERN}" );@]@=}
-<VERS_NODE>{V_IDENTIFIER} {@> @[TeX_( "/yylexreturnval{VERS_IDENTIFIER}" );@]@=}
-<VERS_SCRIPT>{V_TAG} {@> @[TeX_( "/yylexreturnval{VERS_TAG}" );@]@=}
-<VERS_START>"{" {@> @[TeX_( "/yyBEGIN{VERS_SCRIPT}/yylexreturnchar" );@]@=}
@g
@ There is a bit of a trick to returning an absolute hex value. The
@@ -455,23 +437,6 @@ macros are looking for a \.{\$} suffix while the contents of
@[TeX_( "{/the/yyfmark}{/the/yysmark}}}/next" );@]@;
@[TeX_( "/yylexreturn{INT}" );@]@;
-@ @<Additional macros for the \ld\ lexer/parser@>=
-@G(t)
-@=\def\matchcomment@@#1/*#2\yyeof#3#4{%@>@;
- \yystringempty{#1}{#3}{#4}%
-}
-\def\matchcomment#1{%
-@= \expandafter\matchcomment@@\the#1/*\yyeof@>@;
-}
-\def\ldstripquotes@@"#1"\yyeof{#1}
-\def\ldstripquotes#1{%
- \yytext\expandafter\expandafter\expandafter
- {\expandafter\ldstripquotes@@\the\yytext\yyeof}%
- \yytextpure\expandafter\expandafter\expandafter
- {\expandafter\ldstripquotes@@\the\yytextpure\yyeof}%
-}
-@g
-
@ {\it Annoyingly, this pattern can match comments, and we have
longest match issues to consider. So if the first two
characters are a comment opening, put the input back and
@@ -485,31 +450,103 @@ try again.}
@<Return the \prodstyle{NAME} inside quotes@>=
@[TeX_( "/ldstripquotes/yylexreturnsym{NAME}" );@]@;
-@ @<Additional macros for the \ld\ lexer/parser@>=
+@ Some syntax specific to version scripts.
+@<Regular expressions for \ld\ tokens@>=
+@G(fs2)
+<VERS_SCRIPT>{
+ "{" {@> @[TeX_( "/yyBEGIN{VERS_NODE}/versnodenesting=/z@@/yylexreturnchar" );@]@=}
+ "}" {@> @[TeX_( "/yylexreturnchar" );@]@=}
+ {V_TAG} {@> @[TeX_( "/yylexreturnval{VERS_TAG}" );@]@=}
+}
+
+<VERS_NODE>{
+ global {@> @[TeX_( "/yylexreturnptr{GLOBAL}" );@]@=}
+ local {@> @[TeX_( "/yylexreturnptr{LOCAL}" );@]@=}
+ extern {@> @[TeX_( "/yylexreturnptr{EXTERN}" );@]@=}
+ {V_IDENTIFIER} {@> @[TeX_( "/yylexreturnval{VERS_IDENTIFIER}" );@]@=}
+ "{" {@> @[TeX_( "/advance/versnodenesting/@@ne /yylexreturnchar" );@]@=}
+ "}" {@> @<Finish the current group, possibly switch to \flexsnstyle{VERS_SCRIPT}@> @=}
+}
+
+<VERS_NODE,VERS_SCRIPT>[:,;] {@> @[TeX_( "/yylexreturnchar" );@]@=}
+<VERS_START>"{" {@> @[TeX_( "/yyBEGIN{VERS_SCRIPT}/yylexreturnchar" );@]@=}
+
+<VERS_START,VERS_NODE,VERS_SCRIPT>{
+ [\n] {@> @[TeX_( "/yylexnext" );@]@=}
+ #.* {@> @[TeX_( "/yylexnext" );@]@=}
+ [ \t\r]+ {@> @[TeX_( "/yylexnext" );@]@=}
+}
+@g
+
+@ @<Finish the current group, possibly switch to \flexsnstyle{VERS_SCRIPT}@>=
+ @[TeX_( "/advance/versnodenesting/m@@ne" );@]@;
+ @[TeX_( "/ifnum/versnodenesting</z@@" );@]@;
+ @[TeX_( " /yyBEGIN{VERS_SCRIPT}" );@]@;
+ @[TeX_( "/fi" );@]@;
+ @[TeX_( "/yylexreturnchar" );@]@;
+
+@ Some syntax specific to \MRI\ scripts.
+@<Regular expressions for \ld\ tokens@>=
+@G(fs2)
+<MRI>{
+ "#".*\n? {@> @[TeX_( "/yylexnext" );@]@=}
+ "\n" {@> @[TeX_( "/yylexreturnptr{NEWLINE}" );@]@=}
+ "*".* {@> @[TeX_( "/yylexnext" );@]@=}
+ ";".* {@> @[TeX_( "/yylexnext" );@]@=}
+ "END"|"end" {@> @[TeX_( "/yylexreturnptr{ENDWORD}" );@]@=}
+ "ALIGNMOD"|"alignmod" {@> @[TeX_( "/yylexreturnptr{ALIGNMOD}" );@]@=}
+ "ALIGN"|"align" {@> @[TeX_( "/yylexreturnptr{ALIGN_K}" );@]@=}
+ "CHIP"|"chip" {@> @[TeX_( "/yylexreturnptr{CHIP}" );@]@=}
+ "BASE"|"base" {@> @[TeX_( "/yylexreturnptr{BASE}" );@]@=}
+ "ALIAS"|"alias" {@> @[TeX_( "/yylexreturnptr{ALIAS}" );@]@=}
+ "TRUNCATE"|"truncate" {@> @[TeX_( "/yylexreturnptr{TRUNCATE}" );@]@=}
+ "LOAD"|"load" {@> @[TeX_( "/yylexreturnptr{LOAD}" );@]@=}
+ "PUBLIC"|"public" {@> @[TeX_( "/yylexreturnptr{PUBLIC}" );@]@=}
+ "ORDER"|"order" {@> @[TeX_( "/yylexreturnptr{ORDER}" );@]@=}
+ "NAME"|"name" {@> @[TeX_( "/yylexreturnptr{NAMEWORD}" );@]@=}
+ "FORMAT"|"format" {@> @[TeX_( "/yylexreturnptr{FORMAT}" );@]@=}
+ "CASE"|"case" {@> @[TeX_( "/yylexreturnptr{CASE}" );@]@=}
+ "START"|"start" {@> @[TeX_( "/yylexreturnptr{START}" );@]@=}
+ ("LIST"|"list").* {@> @[TeX_( "/yylexreturnptr{LIST}" );@]@=}
+ "SECT"|"sect" {@> @[TeX_( "/yylexreturnptr{SECT}" );@]@=}
+ "EXTERN"|"extern" {@> @[TeX_( "/yylexreturnptr{EXTERN}" );@]@=}
+ {FILENAMECHAR1}{NOCFILENAMECHAR}* {@> @[TeX_( "/yylexreturnsym{NAME}" );@]@=}
+}
+@g
+
+@ The macros and the register definitions used to implement the actions above have been collected in this
+section.
+@<Additional macros for the \ld\ lexer/parser@>=
@G(t)
\newcount\versnodenesting
\newcount\includestackptr
+
+\def\matchcomment#1{%
+@= \expandafter\matchcomment@@\the#1/*\yyeof@>@;
+}
+
+@=\def\matchcomment@@#1/*#2\yyeof#3#4{%@>@;
+ \yystringempty{#1}{#3}{#4}%
+}
+
+\def\ldstripquotes#1{%
+ \yytext\expandafter\expandafter\expandafter
+ {\expandafter\ldstripquotes@@\the\yytext\yyeof}%
+ \yytextpure\expandafter\expandafter\expandafter
+ {\expandafter\ldstripquotes@@\the\yytextpure\yyeof}%
+}
+
+\def\ldstripquotes@@"#1"\yyeof{#1}
@g
-@ Some syntax specific to version scripts.
-@<\ld\ token regular expressions@>=
+@ Catchall actions. These react to unexpected characters with (somewhat misleading) error messages. The placement
+of these rules is important, since they may match a token of the same length defined earlier.
+@<Regular expressions for \ld\ tokens@>=
@G(fs2)
-<VERS_SCRIPT>"{" {@> @[TeX_( "/yyBEGIN{VERS_NODE}/versnodenesting=/z@@/yylexreturnchar" );@]@=}
-<VERS_SCRIPT>"}" {@> @[TeX_( "/yylexreturnchar" );@]@=}
-<VERS_NODE>"{" {@> @[TeX_( "/advance/versnodenesting/@@ne /yylexreturnchar" );@]@=}
-<VERS_NODE>"}" {@> @[TeX_( "/advance/versnodenesting/m@@ne" );@]@=
- @> @[TeX_( "/ifnum/versnodenesting</z@@" );@]@=
- @> @[TeX_( " /yyBEGIN{VERS_SCRIPT}" );@]@=
- @> @[TeX_( "/fi" );@]@=
- @> @[TeX_( "/yylexreturnchar" );@]@=}
-<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] {@> @[TeX_( "/yylexnext" );@]@=}
-<VERS_START,VERS_NODE,VERS_SCRIPT>#.* {@> @[TeX_( "/yylexnext" );@]@=}
-<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ {@> @[TeX_( "/yylexnext" );@]@=}
+<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. {@> @[TeX_( "/yyfatal{bad character `/the/yytext' in script}" );@]@=}
+<EXPRESSION,DEFSYMEXP,BOTH>. {@> @[TeX_( "/yyfatal{bad character `/the/yytext' in expression}" );@]@=}
<<EOF>> {@> @[@<Process the end of (possibly included) file@>@]@=}
-
-<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. {@> @[TeX_( "/yyfatal{bad character `/the/yytext' in script}" );@]@=}
-<EXPRESSION,DEFSYMEXP,BOTH>. {@> @[TeX_( "/yyfatal{bad character `/the/yytext' in expression}" );@]@=}
@g
@ @<Process the end of (possibly included) file@>=