私は 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 からの入力は "select $abc from $ddd" であるため、レクサーが "identifier_expr" アクションでトークン FROM を返すと、出力は "ident_expr:abc from" になります。