我目前正在尝试使用 Flex+Bison 编写一个小型编译器,但在如何处理错误方面我有点迷茫,特别是如何使所有内容组合在一起。为了激发讨论,请考虑以下我用于字符串文字的词法分析器片段:
["] { BEGIN(STRING_LITERAL); init_string_buffer(); }
<STRING_LITERAL>{
\\\\ { add_char_to_buffer('\\'); }
\\\" { add_char_to_buffer('\"'); }
\\. { /*Invalid escape. How do I treat this error?*/ }
["] { BEGIN(INITIAL); yylval = get_string_buffer(); return TK_STRING; }
}
如何处理无效转义的情况?现在我只是打印一条错误消息并调用exit
,但如果可能的话,我希望能够继续并检测每个文件多个错误。
我的问题:
- 我用什么函数来打印错误信息?野牛稍后会出现同样的 yyerror 吗?如果词法分析器和解析器有单独的文件,我应该把 yyerror 的定义放在哪里?
- 我应该从我的操作中返回什么令牌代码?0 表示“文件结尾”?一些特殊的 TK_INVALID_STRING 令牌?
- 如何确保解析器在出现词汇错误(无效的文字、杂散的标点符号等)后可以继续解析?