【问题标题】:Changing buffers inside of yyparse();更改 yyparse() 内部的缓冲区;
【发布时间】:2012-02-25 01:08:31
【问题描述】:

在解析另一个字符串的过程中,我正在尝试使用预定义的语法解析一个常量字符串。

我的main()调用yyparse(),用户开始输入,当匹配到某个语法时,比如MACRO什么的,我想执行yy_scan_string("..."); 我遇到了几个问题

  • 我需要的所有常量都是由 flex 创建的,然后我需要在我的 bison 文件中,这取决于 flex 输出
    • 我通过从已编译的 flex 部分复制 #ifndef 语句解决了这个问题
  • 在调用yy_scan_string 后,我尝试调用yyparse(),但这让我陷入了无限循环
  • 如果我调用yy_delete_buffer 然后我会终止我的主要解析,并且代码会退出。

我错过了什么?似乎是一个简单的任务,我只想解析一个存储的字符串,中间解析一个文件,然后返回常规解析。

【问题讨论】:

    标签: bison yacc lex flex-lexer


    【解决方案1】:

    如果您要使用 yy_scan_string() 来对新字符串进行 lex,最好同时使用 yypush_buffer_state()yypop_buffer_state() 来保存 current 的上下文解析状态。 (有关示例实现,请参阅Multiple Input Buffers。)

    【讨论】:

    • 有没有办法不开始一个全新的状态?好像稍微修改一下当前流?
    • “常量”是指弹性常量,例如YY_BUFFER_STATE。我正确使用%tokens
    • 感觉应该有,但这超出了我的经验。对不起。
    【解决方案2】:

    您是否尝试在另一个解析过程中调用野牛生成的解析器?请记住,解析器是有状态的——如果您想以可重入方式使用 bison,您必须明确要求 bison 生成可重入解析器,这不是默认设置。野牛手册中有解释如何请求的文档。参见,例如:http://www.gnu.org/software/bison/manual/bison.html#Pure-Decl

    顺便说一下,flex 也不是默认可重入的,你可能必须在那里做类似的事情。

    【讨论】:

    • 不知道可重入解析。你能提供更多细节吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多