FLEX 中的回声和拒绝

sc1*_*013 2 gcc lex flex-lexer

下面是一个 FLEX 程序的片段

%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%
Run Code Online (Sandbox Code Playgroud)

输入:

abcd
Run Code Online (Sandbox Code Playgroud)

输出:

abcdabcabaxxaxxbxxcxxdxx
Run Code Online (Sandbox Code Playgroud)

有人可以解释如何获得此输出吗?

ric*_*ici 5

REJECT有效地导致flex备份到下一个更好的比赛,记住以下优先规则flex

  1. 匹配最长可能的令牌。
  2. 在具有相同长度的标记中,更喜欢源文件中较早的模式。

在您的情况下,字符串abcd将匹配a, ab,abcabcd; 首选的是最长的 ( abcd)。

由于您在ECHO操作之前有一个操作REJECTECHO即使稍后匹配将被拒绝,也会发生。最终,flex将回退到默认规则(它也匹配a但在源文件的后面),它将打印xxa并接受字符。现在,除了默认规则外,没有任何匹配项,因此接下来的三个字符一次匹配一个。

如果您将'\n's写入标准输出,这可能会更清楚。