我正在使用一个有40年历史的lex程序,它的语句如下
BEGIN PROGRAM + 1;我明白什么
BEGIN PROGRAM但是+ 1的意图是什么呢?它是否跳过了上下文中的第一个规则?生成的代码表明没有,但我还没有深入研究它。它是否选择了在上下文之后列出的上下文?这似乎有点似是而非,但测试lex程序并不支持这种意图(很可能测试程序没有得到有效的编写)。我用的是flex,不是40岁的莱克斯。
为了完整起见,下面是测试程序:
$ cat t.lex
%s A B C
%%
BEGIN A;
[BC] if (yytext[0] == 'B') BEGIN B + 1; else BEGIN C;
. printf("A: '%c'\n", yytext[0]);
[AC] if (yytext[0] == 'A') BEGIN A; else BEGIN C;
. printf("B: '%c'\n", yytext[0]);
[AB] if (yytext[0] == 'A') BEGIN A; else BEGIN B;
. printf("C: '%c'\n", yytext[0]);
%%
main() { yylex(); }
$ echo abcBabc | ./a.out
A: 'a'
A: 'b'
A: 'c'
B: 'a'
B: 'b'
B: 'c'
$发布于 2020-10-28 18:54:58
在lex程序中,可以有启动条件,这些条件由%s指令定义,如下所示:
%s PROGRAM COMMENT WHATEVER然后在使用BEGIN宏的用户之间切换。在快速检查中,那些连续从1开始的flex编号(因为预定义的INITIAL状态是0)。
在运行flex时,您可以在lex.yy.c中看到如下一些行:
#define INITIAL 0
#define PROGRAM 1
#define COMMENT 2
#define WHATEVER 3示例中的表面程序员决定对1进行硬编码,而不是使用该符号。
https://unix.stackexchange.com/questions/616879
复制相似问题