0

我正在尝试编写一个 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*”

因为标准输入的输入是“从 $ddd 中选择 $abc”,所以当词法分析器返回令牌 FROM 时发生了还原,在“identifier_expr”操作中,输出是“ident_expr:abc from”,为什么会这样?

4

1 回答 1

1

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

请参阅野牛常见问题解答弹性手册或任何数量的 SO 问题(由于许多提问者误诊了问题,因此更难搜索)。

于 2013-05-21T05:12:47.080 回答