lex 开始条件

lex 开始条件

我正在使用一个已有 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而不是使用符号。

相关内容