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