我目前正在尝试使用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
,但如果可能的话,我希望能够继续运行并检测文件中的多个错误。
我的问题:
- 我应该使用哪个函数来打印错误信息?是否应该使用后面 bison 需要的相同的 yyerror 函数?如果词法分析器和语法分析器在不同的文件中,我应该将 yyerror 函数的定义放在哪里?
- 我应该从我的动作中返回哪个标记代码?对于“文件结束”应该返回 0 吗?还是一些特殊的 TK_INVALID_STRING 标记?
- 如何确保语法分析器在出现词法错误(无效的文字、杂散的标点符号等)后能够继续解析?