我正在尝试编写一个 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”,为什么会这样?