%{ #include #define YYERROR_VERBOSE void yyerror(char *); void addtype(char *, int); #define T_INT 0 #define T_REAL 1 %} %union { int idType; char * name; } %token INT REAL ID ILLEGAL_CHAR %type ID %type type %verbose %% def: type { $$ = $1; } list ; type: INT { $$ = T_INT; } | REAL { $$ = T_REAL; } ; list: list ',' ID { addtype($3, $0); } | ID { addtype($1, $0); } ; %% void addtype(char *id, int type) { printf("Adding type %s for id '%s'\n", (type ? "REAL" : "INT"), id); } void yyerror(char *msg) { printf("\n%s\n", msg); } int main() { return yyparse(); }