【问题标题】:How to raise flex error into bison如何将 flex 错误提高到野牛中
【发布时间】:2017-04-02 06:04:44
【问题描述】:
我在野牛解析器中使用弹性解析器来解析输入文件中的词位。 flex 解析器检测到一些错误(即未闭合的括号或不可接受的符号)。我想从 flex 通知野牛解析器发生错误并且语法解析应该失败。现在我在 .l 文件中使用这样的代码
RegExpForInvalidChars: {yyerror("Unaccaptable char")};
但是野牛在调用 yylex 时获得了空的词位(因为我不返回任何值)并忽略了它。如此糟糕的符号刚刚被跳过并继续解析。
【问题讨论】:
标签:
parsing
bison
flex-lexer
【解决方案1】:
最简单的方法是简单地将野牛传递给它无法识别的词位。如果您使用标准后备规则,这将或多或少是自动的:
.|\n { return yytext[0]; }
因为该规则只会返回无法识别的标记字符串的第一个字符。
当解析器接收到一个它无法识别的token值时,它会立即报告一个语法错误。
在几乎所有应用程序中,词法分析器都没有必要或最佳实践尝试识别将由解析器检测到的错误。例如,大多数语法在包含 unbalancex 括号的输入上都会失败,因此不需要用逻辑来增加词法分析器以保持括号计数。此外,如果您最终决定尝试在解析器中实现错误恢复,您会发现它与扫描器中实现的状态跟踪的交互很糟糕。
【解决方案2】:
通常的方法是有规则:
. { return *yytext; }
在您的词法分析器规则的末尾。这样,任何不是(部分)有效词位的单个字符都将直接返回到野牛语法,这将导致语法错误。如果启用 bison 的详细错误消息,语法错误将包括实际的无效字符。