gpt4 book ai didi

bison - 我应该如何处理 Flex 词法分析器中的词法错误?

转载 作者:行者123 更新时间:2023-12-04 10:52:26 25 4
gpt4 key购买 nike

我目前正在尝试使用 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 的定义放在哪里?
  • 我应该从我的操作中返回什么 token 代码? 0 表示“文件结尾”?一些特殊的 TK_INVALID_STRING token ?
  • 如何确保解析器可以在出现词法错误(无效文字、杂散标点符号等)后继续解析?
  • 最佳答案

    有很多选择。哪个最好可能是见仁见智了。 (请注意,SO 不会善待答案是意见而不是事实的问题。)

    这在很大程度上取决于您通常如何处理应用程序中的错误消息。但这里有几种可能性:

  • 直接从词法分析器打印错误消息。告诉错误检测系统编译不成功:你可以使用全局错误计数(yuk,globals!),或传递给 yylex 的共享数据结构。作为附加参数。然后只需忽略该字符并继续进行词法分析。
  • 返回类似 TK_INVALID_STRING 的内容到解析器。解析器需要有适当的 error生产以便适本地处理和恢复这个错误,这是更多的工作,但具有将所有错误处理放入解析器的优点。但是,在字符串的特殊情况下,您可能希望完成字符串的词法分析,直到结束引号;否则,继续解析将是徒劳的。

  • 至于 yyerror : yyerror 没有什么神奇之处.该功能完全由您负责。野牛唯一能做的就是用一组指定的参数调用它。如果您发现它对记录词法分析器中注意到的错误很有用(我认为可能是这样),请继续使用它。您全权负责声明 yyerror , 所以把它的定义放在你的任何共享头文件中 #include在词法分析器和解析器中。或者使用 bison 代码生成选项来获取包含在用 bison 创建的头文件中的定义。什么都容易。一旦你弄清楚如何声明 yyerror ,你可以在任何你想要的地方定义它:在词法分析器文件中,在野牛文件中,或者(我的偏好)在一个单独的支持函数库中。

    (FWIW,我已经尝试过选项 2,在我看来它真的很喜欢工作;选项 1 对我来说效果很好。但口味各不相同,而且 YMMV;我不会在这里为我的选择辩护,但我不不介意承认它。)

    关于bison - 我应该如何处理 Flex 词法分析器中的词法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837828/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com