Bison 更改yyparse()内部的缓冲区;

Bison 更改yyparse()内部的缓冲区;,bison,yacc,lex,flex-lexer,Bison,Yacc,Lex,Flex Lexer,我试图在解析另一个字符串的过程中使用预定义语法解析一个常量字符串。 我的main()调用yyparse(),用户开始键入,当某个语法匹配时,例如MACRO或其他什么,我想执行yy\u scan\u string(“…”) 我遇到了几个问题 我需要的所有常量都是由flex创建的,然后我需要在我的bison文件中,这取决于flex输出 我通过从编译的flex部分复制#ifndef语句来解决这个问题 调用yy\u scan\u string后,我尝试调用yyparse(),但这让我陷入了无限循环

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

我的
main()
调用
yyparse()
,用户开始键入,当某个语法匹配时,例如
MACRO
或其他什么,我想执行
yy\u scan\u string(“…”)
我遇到了几个问题

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

我错过了什么?似乎是一个简单的任务,我只是想解析一个存储的字符串,在解析文件的中间,然后返回到正则解析。

您是在另一个解析的中间尝试调用BISY生成的解析器吗?请记住,解析器是有状态的——如果您想以可重入方式使用bison,则必须特别请求bison生成可重入解析器,这不是默认情况。野牛手册中有说明如何申请的文件。例如,见:


顺便提一下,flex在默认情况下也是不可重入的,您可能需要在那里做类似的事情。

如果您要使用
yy_scan_string()
来lex一个新字符串,最好也使用
yypush_buffer_state()
yypop_buffer_state())
保存当前解析状态的上下文。(有关示例实现,请参见。)

不知道可重入解析。你能提供更多的细节吗?有没有办法不开始一个全新的状态?好像稍微修改一下当前流?我说的“常量”是指flex常量,比如
YY\u BUFFER\u STATE
。我正确地使用了
%token
s,感觉应该有,但这超出了我的经验。很抱歉