%token PLUS TIMES LPAR RPAR IDENTIFIER %% E: E PLUS T { $$ = make_tuple("+", $1, $3);} | T { $$ = $1; } T: T TIMES F { $$ = make_tuple("*", $1, $3);} | F { $$ = $1; } F: LPAR E RPAR { $$ = $2;} | IDENTIFIER { $$ = $1; } %% int prev_tuple = 0; int make_tuple(char *op, int arg1, int arg2){ printf("T%d: (%s, ", ++prev_tuple, op); if( arg1 > 0 ) printf("%s, ", arg1); else printf("T%d, ", -arg1); if( arg2 > 0 ) printf("%s ", arg2); else printf("T%d", -arg2); printf(")\n"); return(-prev_tuple); } int yyerror(char *s){ printf("error:%s\n", s); return 0; } main(){ printf("ŠJŽn\n"); yyparse(); return 0; }