我目前正在阅读Lesk and Schmidt撰写的有关Lex的文档,并对REJECT动作感到困惑。
考虑这两个规则
a[bc]+ { ... ; REJECT;}
a[cd]+ { ... ; REJECT;}
输入:
ab
只有第一个匹配,然后看看我们从材料中得到什么。
动作REJECT的意思是“去做下一个选择”。它将导致执行当前规则之后第二选择的规则。
但是,没有第二选择,会不会出错?
答案 0 :(得分:2)
REJECT
的用例实际上很少;除了示例以外,我认为我从未见过使用它的实例。
无论如何,除非您指定%option nodefault
(或-s
命令行标志),否则flex会将默认的后备操作添加到您的规则集中,等效于
.|\n ECHO;
根据您的情况,该样式将在拒绝后匹配。
但是,可以覆盖默认操作;例如,您可以添加以下规则:
.|\n REJECT;
在这种情况下,flex实际上在两个REJECT
之后并没有替代方法,它将在stderr
上打印一条错误消息(“ flex扫描仪卡住”),然后调用{{1 }}。