我正在使用一个已有 40 年历史的 lex 程序,其中包含如下语句
BEGIN PROGRAM + 1;
我明白什么
BEGIN PROGRAM
确实如此,但是这样做的目的是什么+ 1
?它会跳过上下文中的第一条规则吗<PROGRAM>
?生成的代码表明不是,但我还没有深入研究它。它是否选择上下文之后列出的上下文<PROGRAM>
?这看起来似乎更合理一些,但是测试 lex 程序不支持该意图(很可能测试程序编写得无效)。我使用的是 flex,而不是 40 年前版本的 lex。
为了完整起见,这里是测试程序:
$ 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'
$
答案1
在 lex 程序中,您可以有启动条件,它们由一个定义%s
像这样的指令:
%s PROGRAM COMMENT WHATEVER
然后使用BEGIN
宏。快速检查一下,flex 对从 1 开始的连续编号(因为预定义的INITIAL
状态是0
)。
运行 flex,你会看到lex.yy.c
这样的几行:
#define INITIAL 0
#define PROGRAM 1
#define COMMENT 2
#define WHATEVER 3
对于您的示例,表面上的程序员决定硬编码1
而不是使用符号。