/* http://www.linux-france.org/article/devl/lexyacc/minimanlexyacc-4.html */ %{ /*#include "global.h"*/ #define YYSTYPE char * #include #include #include #include int yylex (void); int yyerror (char *); char strbuff[1024]; char *strExp = NULL; %} %token NUM %token PLUS MINUS TIMES DIV %token LPAR RPAR %token NL %left PLUS MINUS %left TIMES DIV %left NEG %start line %% line: exp { strExp = $1; $$=$1; } ; exp: NUM { $$ = $1; } | exp PLUS exp { sprintf(strbuff,"(add %s %s)",$1,$3); $$ = strdup(strbuff); } | exp MINUS exp { sprintf(strbuff,"(sub %s %s)",$1,$3); $$ = strdup(strbuff); } | exp TIMES exp { sprintf(strbuff,"(mul %s %s)",$1,$3); $$ = strdup(strbuff); } | exp DIV exp { sprintf(strbuff,"(div %s %s)",$1,$3); $$ = strdup(strbuff); } | MINUS exp %prec NEG { sprintf(strbuff,"-%s",$2); $$ = strdup(strbuff); } | LPAR exp RPAR { $$ = $2; } ; %% int yyerror(char *s) { printf("error: %s\n",s); return 1; } int main(int argc, char **argv) { yyparse(); printf("Resultat: %s\n", strExp); return 0; }