在互聯網上搜索lex/yacc示例和教程。邊幹邊學。 在C編程的能力也是必要的。
http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html
法是古老的Unix詞法分析器,其從基於正則表達式生成規範C代碼。yacc是構建語法樹的古老Unix解析器。它也會生成C代碼。
這些工具的現代GNU版本被稱爲flex和野牛。
這是計算器的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; }
;
%%
來源
2014-02-24 16:29:19
SzG