%{ #define YYERROR_VERBOSE void yyerror(char *); %} %verbose %token COMMAND ID KEYWORD ILLEGAL_CHAR %% rule: COMMAND optional_keyword '(' ID ')' ; optional_keyword: /* empty */ | '(' KEYWORD ')' ; %% void yyerror(char *msg) { printf("\n%s\n", msg); } int main() { return yyparse(); }