GCC сообщает об ошибке синтаксиса перед числовой константой в сгенерированном заголовочном файле от bison

Когда я компилирую свой файл .y с помощью команды bison parser.y -d -t, а затем включаю файл parser.tab.h в свой файл flex, gcc говорит: «ошибка: синтаксическая ошибка перед числовой константой». Это ссылка на строку 32, которая является первой строкой в ​​перечислении yytokentype.

enum yytokentype {
   BREAK = 258,
   ... }

Ошибка касается строки «BREAK = 258». Честно говоря, я не знаю, почему это происходит - я бы очень хотел использовать сгенерированный yylval, и он мне нужен из этого заголовочного файла. Даже если бы я объявил yytokentype таким образом в своем flex-файле, я бы получил ту же ошибку. Что-нибудь, что я могу делать неправильно?


person Kizaru    schedule 13.08.2010    source источник
comment
Я предполагаю, что где-то над строкой с ошибкой есть переопределение BREAK. Флаг -E для gcc хорош для выявления этих проблем.   -  person msw    schedule 13.08.2010


Ответы (2)


Определен ли BREAK где-то еще в вашем коде? Я получаю аналогичную ошибку из следующего игрушечного примера:

#define BREAK 10
enum yytokentype {
    BREAK = 258
};

Пример сборки:

$ cc -c file.c 
file.c:4: error: expected identifier before numeric constant
person Carl Norum    schedule 13.08.2010
comment
Хм? Этот пример не будет работать с #define или без него из-за точки с запятой. - person ; 13.08.2010
comment
Ага... Вот в чем дело. Я проверил все свои #includes и нашел это в одном из них. Спасибо за помощь вам обоим. - person Kizaru; 13.08.2010
comment
@Kinopiko, упс, надо было скопировать/вставить вместо повторного ввода. Исправлено сейчас. - person Carl Norum; 13.08.2010

Предположительно BREAK уже определен где-то в выходном файле flex, поэтому после запуска препроцессора вы получаете оператор типа 99 = 258 или что-то в этом роде. Попробуйте посмотреть на вывод cpp yy.lex.c или gcc -E yy.lex.c. Я просмотрел выходной файл flex, но нигде не нашел в нем BREAK, только YY_BREAK.

person Community    schedule 13.08.2010