2016-11-18 33 views
1

我在bison分析器中使用flex分析器来解析输入文件中的词位。 Flex解​​析器检测到一些错误(即未关闭的括号或不可接受的符号)。我想从flex通知bison解析器发生错误,语法解析失败。现在我用这样的代码.L文件如何将弹性错误提升为野牛

RegExpForInvalidChars: {yyerror("Unaccaptable char")}; 

但野牛时调用函数yylex取得的空语义(因为我不返回任何值),并忽略了它。如此糟糕的符号只是被跳过而解析正在进行。

回答

1

通常的方式就是让规则:

. { return *yytext; } 

在你的词法规则的结束。这样,任何不是有效词位(部分)的单个字符都将直接返回到野牛语法,这将导致语法错误。如果您启用野牛的详细错误消息,则语法错误将包含实际无效字符。

0

最简单的方法是简单地通过一个它不识别的bison一个词位。这将是或多或少自动,如果你使用标准的后备规则:

.|\n  { return yytext[0]; } 

,因为该规则将只返回一个无法识别的标记字符串的第一个字符。

当解析器收到一个它无法识别的令牌值时,它会立即报告语法错误。

在几乎所有的应用程序中,词法分析器既没有必要也没有最佳实践来尝试识别解析器将检测到的错误。例如,大多数语法在包含非平衡括号的输入上会失败,因此用逻辑来扩充词法分析器以维护括号计数是不必要的。此外,如果您最终决定试图在解析器中实现错误恢复,则会发现它与扫描器中执行的状态跟踪严重相互影响。