%{ /* In der Vorlesung am 14.1.2008 gemeinsam erstellte Variante von * typedecl-glob.[ly], bei der yacc nicht rechtzeitig entscheiden * kann, welche von zwei eingebetteten Aktionen ausgefuehrt werden * muss. Dies fuehrt zu einem Reduce/Reduce-Fehler. Auch die * Vorschau von einem Zeichen reicht hier nicht mehr aus. Inhaltlich * ist diese Grammatik nicht besonders sinnvoll. */ #include #define YYERROR_VERBOSE void yyerror(char *); void addtype(char *, int); #define T_INT 0 #define T_REAL 1 int curr_type; %} %union { int idType; char * name; } %token INT REAL ID ILLEGAL_CHAR %type ID %type type %verbose %% d: def | def2; def: type { curr_type = $1; } list ; def2: type { curr_type = $1; } ID ; type: INT { $$ = T_INT; } | REAL { $$ = T_REAL; } ; list: list ',' ID { addtype($3, curr_type); } | ID { addtype($1, curr_type); } ; %% 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(); }