[talk] lex start conditions.
R. Clayton
factotum at rclayton.org
Wed Oct 28 19:25:41 EDT 2020
I'm working with a 40-year-old lex program that uses statements like
BEGIN PROGRAM + 1;
I understand what
BEGIN PROGRAM;
does, but what is the intention of the "+ 1"? Does it skip the first rule in
the <PROGRAM> context? The generated code suggests not, but I haven't dug into
it too deeply. Does it select the context listed after the <PROGRAM> context?
That seems slightly more plausible, but a test lex program doesn't support that
intention (it's likely the test program is ineffectively written). I'm using
flex, not a 40-year-old version of lex.
For completeness, here's the test program:
$ cat t.lex
%s A B C
%%
BEGIN A;
<A>[BC] if (yytext[0] == 'B') BEGIN B + 1; else BEGIN C;
<A>. printf("A: '%c'\n", yytext[0]);
<B>[AC] if (yytext[0] == 'A') BEGIN A; else BEGIN C;
<B>. printf("B: '%c'\n", yytext[0]);
<C>[AB] if (yytext[0] == 'A') BEGIN A; else BEGIN B;
<C>. printf("C: '%c'\n", yytext[0]);
%%
main() { yylex(); }
$ echo abcBabc | ./a.out
A: 'a'
A: 'b'
A: 'c'
B: 'a'
B: 'b'
B: 'c'
$
More information about the talk
mailing list