%{ #include #include "exprtree.h" extern exprtree *theExprtree; %} %union { ident ident; exprtree *exprtree; } %token T_IDENT T_NUMBER %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); } ; arglist : { $$ = 0; } | args { $$ = $1; } ; args : expr { $$ = $1; } | args ',' expr { $$ = arglist_append($1, $3); } ; %% int yyerror (char *s) { fprintf(stderr, "%s\n", s); return 0; }