当使用Lex扫描无效的令牌或字符时,是否存在应返回的特殊错误代码,或者我应该使用EXIT_FAILURE
调用退出函数?
答案 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
;只有客户端代码才能做出决定。