Bison 野牛的减产并没有像预期的那样奏效

Bison 野牛的减产并没有像预期的那样奏效,bison,flex-lexer,reduction,Bison,Flex Lexer,Reduction,我正在尝试编写一个EPL解析器,因此我正在学习flex和bison。我尝试将其与以下规则SQL一起使用: SELECT { cout<<"SELECT detected"<<endl;return SELECT; } FROM { cout<<"FROM detected"<<endl;return FROM;} [a-zA-Z][0-9a-zA-Z]* { cout<<"IDENTIFIER detected"<<endl

我正在尝试编写一个EPL解析器,因此我正在学习flex和bison。我尝试将其与以下规则SQL一起使用:

SELECT { cout<<"SELECT detected"<<endl;return SELECT; }
FROM { cout<<"FROM detected"<<endl;return FROM;}
[a-zA-Z][0-9a-zA-Z]* { cout<<"IDENTIFIER detected"<<endl;yylval.c=yytext;
                         return IDENTIFIER; }
'$' { return DOL;}
[ \t] { cout<<"space founded:"<<int(yytext[0])<<endl; }
\n { return EOL;}
. {}
野牛的规则是:

sel_stmt : {cout<<"VOID"<<endl;}
         | SELECT identifier_expr FROM identifier_expr {    cout<<"select statement founded"<<endl; }
         ;

identifier_expr : DOL IDENTIFIER {
$$=$2;
cout<<"ident_expr:"<<$$<<endl;
}
;
所有令牌和非终端都具有char类型*

由于stdin的输入是从$ddd中选择$abc 当lexer从返回令牌时发生reudction,在identifier_expr操作中,输出为 标识expr:abc from 为什么会发生这种情况?

如果要在flex操作之外使用标记字符串yytext,则必须创建其副本。yytext指向的字符串是一个临时值,将在重新输入lexer后立即进行修改


查看、或任何数量的SO问题,这些问题很难搜索,因为许多发问者错误地诊断了问题。

明白了。现在我使用一个_-strdup制作yytext的副本,效果如预期。感谢您的帮助。