конец файла bison

Если я забуду поставить пустую строку в конце любого из моих файлов, моя программа получит синтаксическую ошибку. Проблема в том, что моя грамматика ожидает, что новая строка завершит текущую строку. Поскольку новая строка не существует, bison генерирует синтаксическую ошибку, потому что она не завершает правило.

как мне решить эту проблему? Я пытался сделать <<EOF>> return MY_EOF но когда я это делаю, Лекс разбивает ужасную смерть. Я думаю, что в его EOF по умолчанию есть код, который я не вызываю. Я понятия не имею, какие функции они может быть. Используя EOF, создайте ошибку symbol EOF is used, but is not defined as a token and has no rules

4 ответов


вы можете использовать правило flex EOF для добавления новой строки к входу:

<<EOF>> { static int once = 0; return once++ ? 0 : '\n' }

в вашем файле lex

#define yyterminate() return token::END

в вашем файле yacc

%token END 0 "end of file"

на самом деле, чтобы поймать конец файла в lex|flex вы можете использовать yywrap() функция, которая вызывается лексическим анализатором, если достигнут конец входного файла.

это решение доступно как lex, так и flex.обратный вызов yywrap() показывает EOFТак что вы можете переопределить эту функцию и ввести работу нужно сделать в конце входного потока.


предыдущая отлично работает для меня.

Если вы используете C Bizon (не C++), просто используйте END для token::END и в файле yacc %token END

была еще одна проблема после этого, если макросы возвращают не YY_NULL, он никогда не завершается (бесконечный цикл)

Это можно решить так:

bool term = false;
#define yyterminate() return (term = !term)?END : YY_NULL