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



我的野牛/flex解析器从文件中读取输入开始:

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

在此之后的某个时间点,它会从内存中的字符串中读取和解析输入:

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

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

问题是在上面的第二个代码块之后,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);
<</div> div class="one_answers">我想我想通

了,只需通过推送和弹出缓冲区即可。代替上述,我使用了:

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

最新更新