如果因为 REJECT 而在 Lex 程序中不存在匹配的规则怎么办?

What if there exists no matched rule in a Lex program because of REJECT?

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

考虑两条规则

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

输入:

ab

只匹配第一个,看看我们从material中得到什么。

The action REJECT means ``go do the next alternative.'' It causes whatever rule was second choice after the current rule to be executed.

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

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

无论如何,除非您指定 %option nodefault(或 -s 命令行标志),否则 flex 将向您的规则集添加默认回退操作,相当于

.|\n   ECHO;

在您的情况下,该模式将在 REJECT 之后匹配。

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

.|\n   REJECT;

那样的话,flex在两个REJECT之后就真的没有办法了,它会在stderr("flex scanner jammed")上打印错误信息,然后调用exit.