インターネットで lex/yacc の例とチュートリアルを検索してください。実践的学習。Cでプログラミングできる能力も必要です。
http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html
lex は古い Unix lexer であり、正規表現ベースの仕様から C コードを生成します。yacc は、構文ツリーを構築するための古代の Unix パーサーです。Cコードも生成します。
ツールの最新の GNU バージョンは、flex および bison と呼ばれます。
電卓の yacc コードのコアは次のとおりです。トークンからより高いレベルの構成がどのように構築されるか、およびそのような構成に遭遇したときに何をすべきかを示します。
%%
list : // empty
| list stm '\n' { print(); }
| list cmd '\n' { print(); }
| list cmd stm '\n' { print(); }
| list stm cmd '\n' { print(); }
| list cmd stm cmd '\n' { print(); }
| list error '\n' { yyerrok; print(); }
;
cmd : COMMAND { commands[$1](); }
;
stm : expr { output = $1; outputPush(); }
| VAR '=' expr { vars_set($1, &$3); }
;
expr : { outputGet(); $$ = output; }
| '_' { outputGet(); $$ = output; }
| '(' expr ')' { $$ = $2; }
| expr OPADD expr { $$ = tNumOpIn ($1, $2, $3); }
| expr OPMUL expr { $$ = tNumOpIn ($1, $2, $3); }
| expr OPPOW expr { $$ = tNumOpIn ($1, $2, $3); }
| OPPRE expr { $$ = tNumOpPre($1, $2); }
| VAR { if (vars_get($1,&$$)) $$=output; }
| NUMBER { $$ = $1; }
;
%%