В моем парсер, яTypedef проблема с зубрами и сгибать
%union {
SYMTABLE *p_entry ;
QUAD *p_quad ;
} ;
Теперь SYMTABLE является ЬурейеЕ для структуры. Структура и typedef находятся во включенном файле. С этим нет никаких проблем.
QUAD - это typedef для структуры (typedef struct quad QUAD). Структура и typedef находятся во включенном файле.
Там нет никаких проблем делать:
bison -d parser.y
gcc parser.tab.c -c
Мой лексический нуждается yylval, поэтому в декларациях части у меня есть
#include "parser.tab.h" /* bison generated header file */
extern YYSTYPE yylval ;
Когда я
flex scanner.lex
gcc lex.yy.c -c
GCC жалуется
In file included from scanner.lex:16:
parser.y:30: error: syntax error before "QUAD"
parser.y:30: warning: no semicolon at end of struct or union
parser.y:32: error: syntax error before '}' token
parser.y:32: warning: data definition has no type or storage class
parser.tab.h:121: error: syntax error before "yylval"
parser.tab.h:121: warning: data definition has no type or storage class
Если я вернусь к файлу parser.y и заменяю QUAD на struct quad, ТОЛЬКО союз yylval%, проблема исчезнет. Я хочу сказать, что это глупая ошибка typedef, но сгенерированный файл bison просто отлично. Я включил файл заголовка для своего QUAD typedef и struct quad в моем сканере.
Кажется, это единственное место, где возникают проблемы, поэтому я могу просто заменить QUAD на struct quad, но это несовместимо с SYMTABLE.
I знал, что это ошибка на моем конце. Оказывается, в моем сканере у меня есть #include "parser.tab.h" перед #include "quad.h" Я думал, что parser.tab.h будет включать include из quad.h, перенесенный, но он не выглядит , – Kizaru