2013-05-21 117 views
0

我想写一个EPL解析器,所以我正在学习Flex和bison.I请尝试使用以下规则(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 *”

从标准输入输入是 “选择从$ $ ABC DDD” 当词法分析器返回的标记FROM在 reudction happend “标识_expr“动作,输出为 ”ident_expr:abc from“ 为什么会发生这种情况?

回答

1

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

请参阅bison FAQ,flex manual或任何数量的SO问题(由于许多提问者误诊问题而难以搜索)。

+0

明白了。现在我使用_strdup制作yytext的副本,并按预期工作。感谢您的帮助。 – YenvY