FLEX中的回声和拒绝

时间:2012-10-31 13:41:53

标签: gcc lex flex-lexer

以下是FLEX计划的片段

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

输入:

abcd

输出:

abcdabcabaxxaxxbxxcxxdxx

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

1 个答案:

答案 0 :(得分:4)

REJECT有效地使flex备份到下一个更好的匹配,同时考虑到flex的优先规则:

  1. 匹配最长的令牌。
  2. 在具有相同长度的令牌中,更喜欢源文件中较早的模式。
  3. 在您的情况下,字符串abcd将与aababcabcd匹配;首选的是最长的一个(abcd)。

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

    如果您将'\n'写入stdout,这可能会更加清晰。