lex - 如果由于 REJECT 而 Lex 程序中不存在匹配规则怎么办?

标签 lex lexical-analysis

我目前正在阅读 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 扫描仪卡住”)然后调用exit

关于lex - 如果由于 REJECT 而 Lex 程序中不存在匹配规则怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598138/

相关文章:

c++ - 在 C++ 中编译 Lex 输出时出错

c - Bison/Yacc 语法中的无意串联

c - 删除 Lex 中的空白区域

compiler-construction - 如何使用 ANTLR 修改 CommonTokenStream 中的 token 文本?

c - 我应该使用什么编译器作为自学编译器原理技术的案例研究

java - Java 中的词法、句法或语义错误差异

flex-lexer - 如何对同一文本调用多个词法分析器?

c - 计算行数、字符数、数字和关键字数的 Lex 程序

javascript - ECMAScript 2017 : Parsing from nonterminal StringLiteral to String values

regex - 实现词法分析器时 DFA 与正则表达式?