%{ #include #include "ast.h" static Exp parsed_program; /* global to contain top-level result */ %} %token NUM %token ID %token IF0 THEN ELSE VAR %type program exp term block %type vars %type exps %union { int ivalue; char *svalue; Exp exp; ids ids; Exps exps; } %start program %% program : exp {parsed_program = $1;} exp : term {$$ = $1;} | term '+' term {$$ = mk_PlusExp($1,$3);} | term '-' term {$$ = mk_MinusExp($1,$3);} | ID '=' exp {$$ = mk_AsgnExp($1,$3);} | IF0 exp THEN exp ELSE exp {$$ = mk_If0Exp($2,$4,$6);} ; term : ID {$$ = mk_VarExp($1);} | NUM {$$ = mk_ConstExp($1);} | '(' exp ')' {$$ = $2;} | '{' block '}' {$$ = $2;} ; block : VAR vars ';' exps {$$ = mk_BlockExp($2,$4);} | exps {$$ = mk_BlockExp(NULL,$1);} ; vars : ID {$$ = mk_ids($1,NULL);} | ID vars {$$ = mk_ids($1,$2);} ; exps : exp {$$ = mk_Exps($1,NULL);} | exp ';' exps {$$ = mk_Exps($1,$3);} ; %% Exp parse(FILE *fp0) { init_lex(fp0); yyparse(); return parsed_program; }