首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lex起动条件

lex起动条件
EN

Unix & Linux用户
提问于 2020-10-28 15:17:41
回答 1查看 357关注 0票数 0

我正在使用一个有40年历史的lex程序,它的语句如下

代码语言:javascript
复制
  BEGIN PROGRAM + 1;

我明白什么

代码语言:javascript
复制
BEGIN PROGRAM

但是+ 1的意图是什么呢?它是否跳过了上下文中的第一个规则?生成的代码表明没有,但我还没有深入研究它。它是否选择了在上下文之后列出的上下文?这似乎有点似是而非,但测试lex程序并不支持这种意图(很可能测试程序没有得到有效的编写)。我用的是flex,不是40岁的莱克斯。

为了完整起见,下面是测试程序:

代码语言:javascript
复制
$ 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'

$
EN

回答 1

Unix & Linux用户

发布于 2020-10-28 18:54:58

在lex程序中,可以有启动条件,这些条件由%s指令定义,如下所示:

代码语言:javascript
复制
%s PROGRAM COMMENT WHATEVER

然后在使用BEGIN宏的用户之间切换。在快速检查中,那些连续从1开始的flex编号(因为预定义的INITIAL状态是0)。

在运行flex时,您可以在lex.yy.c中看到如下一些行:

代码语言:javascript
复制
#define INITIAL 0
#define PROGRAM 1
#define COMMENT 2
#define WHATEVER 3

示例中的表面程序员决定对1进行硬编码,而不是使用该符号。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/616879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档