加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

野牛 – 我应该如何处理我的Flex词法分析器中的词汇错误?

发布时间:2020-12-15 02:16:49 所属栏目:百科 来源:网络整理
导读:我目前正在尝试使用Flex Bison编写一个小编译器,但我在错误处理方面有点迷失,特别是如何使所有东西都融合在一起.为了激发讨论,请考虑我用于字符串文字的以下词法分析器片段: ["] { BEGIN(STRING_LITERAL); init_string_buffer(); }STRING_LITERAL{ \ { a
我目前正在尝试使用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的定义?
>我应该从我的行动中返回什么令牌代码? 0为“文件结束”?一些特殊的TK_INVALID_STRING令牌?
>如何确保解析器可以在词法错误(无效文字,流浪标点字符等)后继续解析?

解决方法

有很多选择.哪一个最好可能是意见问题. (并且请注意,SO不会对那些答案是意见而不是事实的问题表示友善.)

它在很大程度上取决于您在应用程序中处理错误消息的方式.但这里有几种可能性:

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

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

(FWIW,我已经尝试过选项2,在我看来它似乎太多工作;选项1对我来说很好.但味道各不相同,YMMV;我不会在这里捍卫我的选择,但我不喜欢不介意承认.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读