野牛的减少没有按预期进行

时间:2013-05-21 03:47:09

标签: 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;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;
}
;

所有令牌和非终端都有类型&#34; char *&#34;

因为stdin的输入是&#34;从$ ddd&#34;中选择$ abc; 当lexer返回令牌FROM时,在&#34; identifier_expr&#34;行动,输出是 &#34; ident_expr:abc from&#34; 为什么会这样?

1 个答案:

答案 0 :(得分:1)

如果要在flex操作之外使用它,必须创建令牌字符串(yytext)的副本。 yytext指向的字符串是临时值,并且一旦重新输入词法分析器就会被修改。

请参阅bison FAQflex manual或任意数量的SO问题(由于许多提问者误解了问题,因此难以搜索)。