Во-первых, ваша грамматика принимает только один оператор, поэтому она анализирует первый оператор, а затем выдает синтаксическую ошибку, поскольку следующее прочитанное не является EOF. Попробуйте добавить следующее перед правилом для statement
:
input: /* nothing */
| input statement
;
Это позволит анализатору проанализировать любое количество операторов (0 или более) перед EOF
Во-вторых, ваш лексер не устанавливает yylval для ключевых слов, в то время как ваш синтаксический анализатор ожидает его (он обращается к $1
в действиях, где это соответствует токену ключевого слова), поэтому он получает случайный мусор. В этом случае это NULL, который он передает printf - вам повезло, что он не вылетел.
Чтобы это исправить, вам нужно вернуть что-то в yylval (возможно, строку в yytext), но, поскольку вы не определили это как что-либо еще, yylval - просто int, поэтому не может содержать строку , Вы можете использовать %union
, чтобы сделать yylval объединением, которое может содержать либо int
, либо char *
, но это все еще оставляет вам огромную проблему с управлением памятью, выделяя место для строк и освобождая его, если вам не нужна память утечки. Проще всего было бы избавиться от ссылок на $1
в этих действиях, поскольку вам это на самом деле не нужно.