Posix 在Lex中处理无效令牌

Posix 在Lex中处理无效令牌,posix,lex,Posix,Lex,当使用Lex扫描无效的令牌或字符时,是否应该返回特殊的错误代码,或者我是否应该使用exit\u FAILURE调用exit函数?通常,您不应该尝试在词法扫描程序中检测错误。简单地依赖后备规则要简单得多 . return *yytext; 处理单字符运算符标记和错误。Bison/yacc将把任何未知的令牌类型视为错误,这将允许错误处理集中在解析器组件中 有时不可能避免注意到错误。例如,在像C这样的语言中,字符串文字不能跨越多个源行,如果要尝试错误恢复,词法扫描程序必须检测到未关闭的引号。

当使用Lex扫描无效的令牌或字符时,是否应该返回特殊的错误代码,或者我是否应该使用
exit\u FAILURE
调用exit函数?

通常,您不应该尝试在词法扫描程序中检测错误。简单地依赖后备规则要简单得多

.     return *yytext;
处理单字符运算符标记和错误。Bison/yacc将把任何未知的令牌类型视为错误,这将允许错误处理集中在解析器组件中

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

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

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


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

我想用无效字符。否则,Yacc将只打印“语法错误”。@August:先行标记的文本(无效字符)可作为
yytext
的值提供给yyerror。
["]([^\n\\]|\\(.|\n))*["]    { return STRING; }
["]([^\n\\]|\\(.|\n))*       { return BAD_STRING; }