如何从字符串解析后从文件解析?

时间:2012-12-09 21:07:11

标签: file buffer bison input-buffer

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

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

2 个答案:

答案 0 :(得分:3)

问题是,在上面第二段代码之后,flex的输入缓冲区(YY_CURRENT_BUFFER)指向您在yy_scan_string中创建的缓冲区,并使用yy_delete_buffer删除。因此,对yylex(来自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);

答案 1 :(得分: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