处理Lex中的无效令牌

时间:2018-02-20 21:52:03

标签: posix lex

当使用Lex扫描无效的令牌或字符时,是否存在应返回的特殊错误代码,或者我应该使用EXIT_FAILURE调用退出函数?

1 个答案:

答案 0 :(得分:1)

通常,您不应尝试检测词法扫描程序中的错误。简单地依赖回退规则

就简单得多了
.     return *yytext;

处理单字符操作符令和错误。 Bison / yacc会将任何未知令牌类型视为错误,这样可以将错误处理集中在解析器组件中。

偶尔也不可能避免注意到错误。例如,在像C这样的语言中,其字符串文字不能跨越多个源行,如果要尝试进行错误恢复,则必须由词法扫描程序检测未闭合的引号。 (如果您不打算尝试进行错误恢复,那么您也可以让回退规则将不匹配的引用作为单个'"'令牌处理,如上所述,但如果您要尝试进行错误恢复,则会更好继续下一行而不是下一个字符。)

在这种情况下,仍然可以使用一些其他未使用的单字符令牌。或者您可以在bison / flex文件中定义一个特殊的令牌令牌,它将具有几乎完全相同的效果。

["]([^\n\\]|\\(.|\n))*["]    { return STRING; }
["]([^\n\\]|\\(.|\n))*       { return '"'; }

["]([^\n\\]|\\(.|\n))*["]    { return STRING; }
["]([^\n\\]|\\(.|\n))*       { return BAD_STRING; }

即使您不打算尝试错误恢复(目前),词法分析者也不应自行调用exit。这将阻止解析器生成错误消息或返回错误代码。像任何库函数一样,解析器甚至都不应该调用exit;只有客户端代码才能做出决定。

相关问题