2012-12-09 71 views
2

通过从文件读取输入我的野牛/柔性解析器开始:如何解析从字符串解析文件后?

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

在之后的某个时候,它会读取和存储从一个字符串解析输入:

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

看来工作到目前为止。但是,当程序需要使用第一个代码再次读取和解析文件输入时,它不起作用(终止于分段错误)。有没有解决这个问题?

回答

3

的问题是,在缓冲你的上面的代码,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);