2010-08-23 3 views
1

В моем парсер, я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.

ответ

3

мой test.l:

%{ 
#include "bla.h" 
#include "test.tab.h" /* bison generated header file */ 
extern YYSTYPE yylval ; 
%} 

%% 
\n  printf("nl"); 
.  printf("c"); 
%% 

мой test.y:

%{ 
#include "bla.h" 
%} 

%union { 
     SYMTABLE *p_entry ; 
     QUAD *p_quad ; 
}; 

%% 

input: 
| input; 

%% 

мой bla.h:

typedef void *SYMTABLE; 
typedef void *QUAD; 

моя сборка:

[email protected]:pts/21:~/temp> bison -d test.y 
test.y: conflicts: 1 shift/reduce 
test.y:13.3-7: warning: rule useless in parser due to conflicts: input: input 
[email protected]:pts/21:~/temp> flex test.l  
[email protected]:pts/21:~/temp> icc lex.yy.c -c 
[email protected]:pts/21:~/temp> 
+0

I знал, что это ошибка на моем конце. Оказывается, в моем сканере у меня есть #include "parser.tab.h" перед #include "quad.h" Я думал, что parser.tab.h будет включать include из quad.h, перенесенный, но он не выглядит , – Kizaru

Смежные вопросы