【问题标题】:how to parse from file after parsing from string?从字符串解析后如何从文件中解析?
【发布时间】:2012-12-09 21:07:11
【问题描述】:

我的 bison / flex 解析器首先从文件中读取输入:

FILE *myfile = fopen(file.c_str(), "r");
yyin = myfile;
yyparse();

在那之后的某个时刻,它从内存中的字符串读取并解析输入:

yy_scan_string(str.c_str());
yyparse();
yy_delete_buffer(YY_CURRENT_BUFFER);

到目前为止,它似乎运行良好。但是,当程序需要使用第一个代码再次读取和解析文件中的输入时,它不起作用(以分段错误终止)。这个问题有解决办法吗?

【问题讨论】:

    标签: file buffer bison input-buffer


    【解决方案1】:

    问题在于,在上面的第二个代码块之后,flex 的输入缓冲区 (YY_CURRENT_BUFFER) 指向您在 yy_scan_string 中创建并使用 yy_delete_buffer 删除的缓冲区。因此,下一次对yylex(来自yyparse)的调用可能会因取消悬空指针而崩溃。因此,您需要做的是在调用yy_delete_buffer 之后和再次调用yyparse 之前使用yy_switch_to_buffer 将缓冲区状态设置为有效缓冲区。正如您所注意到的,您可以使用 push/pop 来做到这一点(尽管该代码确实泄漏了两个创建的缓冲区并且从不释放它们)。或者您可以更直接地从字符串中保存和恢复解析周围的旧缓冲区:

    YY_BUFFER_STATE temp = YY_CURRENT_BUFFER;
    yy_scan_string(str.c_str());
    yyparse();
    yy_delete_buffer(YY_CURRENT_BUFFER);
    yy_switch_to_buffer(temp);
    

    【讨论】:

      【解决方案2】:

      我想我想通了,只是通过推送和弹出缓冲区。而不是上面的,我使用:

      yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
      
      yypush_buffer_state(yy_scan_string(str));
      
      yypop_buffer_state();
      

      来源: http://westes.github.io/flex/manual/Multiple-Input-Buffers.html

      【讨论】:

        猜你喜欢
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        相关资源
        最近更新 更多