%{ #include #include #include "types.h" int yylex(); void yyerror(const char *msg); extern char *yytext; ast *ass[MAXASS] = {0}; int asscount = 0; void append(ast *a) { ass[asscount] = a; asscount++; } %} %union { char *intlit; char *name; ast *as; values *vs; } %token INTLIT %token NAME %type EXPR %type ARGS ARG %% PROG : EXPRS {} ; EXPRS : EXPR {append($1);} | EXPRS EXPR {append($2);} ; EXPR : '(' NAME ')' {$$ = newast($2);} | '(' NAME ARGS ')' { ast *a= newast($2); a->vals = $3; $$ = a; } ; ARGS : ARG | ARGS ARG {$$ = addval($1, $2);} ; ARG : EXPR {$$ = newastval($1);} | INTLIT {$$ = newintval(atoi($1));} ; %% void yyerror(const char *msg) { fprintf(stderr, "%s\n", msg); }