%{ #include #include "exprtree.h" extern exprtree *theExprtree; %} %union { ident ident; exprtree *exprtree; } %token T_IDENT T_NUMBER %token T_IF T_THEN T_ELSE T_END %token T_WHILE T_DO %right ';' %right '=' %left '+' '-' %left '*' '/' '%' %left NEG %% start : expr { theExprtree = $1; } ; expr : T_NUMBER { $$ = $1; } | T_IDENT { $$ = make_var($1); } | expr '+' expr { $$ = make_operator(EXPR_ADD, $1, $3); } | expr '-' expr { $$ = make_operator(EXPR_SUB, $1, $3); } | expr '*' expr { $$ = make_operator(EXPR_MUL, $1, $3); } | expr '/' expr { $$ = make_operator(EXPR_DIV, $1, $3); } | expr '%' expr { $$ = make_operator(EXPR_MOD, $1, $3); } | '-' expr %prec NEG { $$ = make_operator(EXPR_NEG, $2, 0); } | '(' expr ')' { $$ = $2; }; | T_IDENT '(' arglist ')' { $$ = make_function($1, $3); } | T_IDENT '=' expr { $$ = make_assignment($1, $3); } | expr ';' expr { $$ = make_sequence($1, $3); } | T_IF expr T_THEN expr T_END { $$ = make_if_then($2, $4); } | T_IF expr T_THEN expr T_ELSE expr T_END { $$ = make_if_then_else($2, $4, $6); } | T_WHILE expr T_DO expr T_END { $$ = make_while($2, $4); } | T_DO expr T_WHILE expr T_END { $$ = make_do_while($2, $4); } ; arglist : { $$ = 0; } | args { $$ = $1; } ; args : expr { $$ = $1; } | args ',' expr { $$ = arglist_append($1, $3); } ; %% int yyerror (char *s) { fprintf(stderr, "%s\n", s); return 0; }