%{ #define YYERROR_VERBOSE void yyerror(char *); %} %verbose %token ';' ID ILLEGAL_CHAR %% list: outerList ';' ; outerList: /* empty */ | outerList outerListItem ; outerListItem: innerList ; innerList: /* empty */ | innerList innerListItem ; innerListItem: ID ; %% void yyerror(char *msg) { printf("\n%s\n", msg); } int main() { return yyparse(); }