如果由于REJECT而在Lex程序中没有匹配的规则怎么办?

时间:2018-07-30 16:10:50

标签: lex lexical-analysis

我目前正在阅读Lesk and Schmidt撰写的有关Lex的文档,并对REJECT动作感到困惑。

考虑这两个规则

a[bc]+   { ... ; REJECT;}
a[cd]+   { ... ; REJECT;}

输入:

ab

只有第一个匹配,然后看看我们从材料中得到什么。

  

动作REJECT的意思是“去做下一个选择”。它将导致执行当前规则之后第二选择的规则。

但是,没有第二选择,会不会出错?

1 个答案:

答案 0 :(得分:2)

REJECT的用例实际上很少;除了示例以外,我认为我从未见过使用它的实例。

无论如何,除非您指定%option nodefault(或-s命令行标志),否则flex会将默认的后备操作添加到您的规则集中,等效于

.|\n   ECHO;

根据您的情况,该样式将在拒绝后匹配。

但是,可以覆盖默认操作;例如,您可以添加以下规则:

.|\n   REJECT;

在这种情况下,flex实际上在两个REJECT之后并没有替代方法,它将在stderr上打印一条错误消息(“ flex扫描仪卡住”),然后调用{{1 }}。