以下是FLEX计划的片段
%%
a |
ab |
abc |
abcd ECHO; REJECT;
.|\n printf("xx%c", *yytext);
%%
输入:
abcd
输出:
abcdabcabaxxaxxbxxcxxdxx
有人可以解释如何获得此输出吗?
答案 0 :(得分:4)
REJECT
有效地使flex
备份到下一个更好的匹配,同时考虑到flex
的优先规则:
在您的情况下,字符串abcd
将与a
,ab
,abc
或abcd
匹配;首选的是最长的一个(abcd
)。
由于您在ECHO
操作之前有REJECT
操作,即使稍后会拒绝该匹配,也会发生ECHO
。最终,flex
将回退到默认规则(它也匹配a
但稍后在源文件中),它将打印xxa
并接受该字符。现在,除了默认规则之外没有任何匹配,因此接下来的三个字符一次一个地匹配它。
如果您将'\n'
写入stdout,这可能会更加清晰。