如果因为 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
.
我目前正在阅读 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
.