更改yyparse()中的缓冲区;

时间:2012-02-25 01:08:31

标签: bison yacc lex flex-lexer

我试图在解析另一个字符串的过程中使用预定义的语法解析一个常量字符串。

我的main()来电yyparse(),用户开始输入,当某个语法匹配时,例如MACRO或其他什么,我想执行yy_scan_string("..."); 我遇到了几个问题

  • 我需要的所有常量都是由flex创建的,然后我需要在我的bison文件中,这取决于flex输出
    • 我通过从已编译的flex部分
    • 复制#ifndef语句来解决这个问题
  • 致电yy_scan_string后,我尝试拨打yyparse(),但这让我陷入无限循环
  • 如果我调用yy_delete_buffer,那么我将终止主解析,然后代码退出。

我错过了什么?看起来像一个简单的任务,我只想在解析文件的过程中解析存储的字符串,然后返回常规解析。

2 个答案:

答案 0 :(得分:1)

如果您要使用yy_scan_string()来提取新字符串,最好还是使用yypush_buffer_state()yypop_buffer_state()来保存当前解析状态。 (有关示例实现,请参阅Multiple Input Buffers。)

答案 1 :(得分:0)

你是否试图在另一个解析的中间调用bison生成的解析器?请记住,解析器是有状态的 - 如果你想以可重入的方式使用bison,你必须特别请求bison生成一个可重入的解析器,这不是默认的。野牛手册中有文档说明如何请求。例如,请参阅:http://www.gnu.org/software/bison/manual/bison.html#Pure-Decl

顺便说一句,我会注意到,默认情况下,flex也不是可重入的,你可能必须在那里做同样的事情。