2

我的 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);

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

4

2 回答 2

4

问题是在上面的第二个代码块之后,flex 的输入缓冲区 ( YY_CURRENT_BUFFER) 指向您在其中创建yy_scan_string并删除的缓冲区yy_delete_bufferyylex因此,对(from )的下一次调用yyparse可能会因取消悬空指针而崩溃。因此,您需要做的是yy_switch_to_buffer在调用之后和再次调用yy_delete_buffer之前将缓冲区状态设置为有效的缓冲区yyparse。正如您所注意到的,您可以使用 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);
于 2012-12-10T02:47:51.830 回答
0

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

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

于 2012-12-09T21:54:50.360 回答