Типдеф проблема с бизоном и флексом - PullRequest
1 голос
/ 24 августа 2010

В моем парсере у меня есть

%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.

1 Ответ

3 голосов
/ 24 августа 2010

my test.l:

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

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

my test.y:

%{
#include "bla.h"
%}

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

%%

input:
| input;

%%

my bla.h:

typedef void *SYMTABLE;
typedef void *QUAD;

my build:

freundt@segen: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
freundt@segen:pts/21:~/temp> flex test.l    
freundt@segen:pts/21:~/temp> icc lex.yy.c -c
freundt@segen:pts/21:~/temp> 
...