В моем парсере у меня есть
%union {
SYMTABLE *p_entry ;
QUAD *p_quad ;
} ;
Теперь SYMTABLE - это typedef для структуры. Структура и 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% union, проблема исчезнет. Я хочу сказать, что это глупая ошибка typedef, но сгенерированный зубрами файл компилируется просто отлично. Я включил файл заголовка для моего QUAD typedef и struct quad в мой сканер.
Кажется, это единственное место, где возникают проблемы, поэтому я мог бы просто заменить QUAD на struct quad, но это несовместимо с SYMTABLE.