2012-05-23 52 views
2

我一直在嘗試一段時間,通過使用bison和lex實現語法分析器。bison/lex YYSTYPE聲明爲struct

我有一個yylval類型重新聲明的問題,我解釋我自己。

我有4個文件:lexico.l,parser.y,funcionesTabla.c,funcionesTabla.h

第一個,包含了野牛/ yacc的 最後兩對法 第二個規格,規格,是一組處理符號表的方法。

我在funcionesTabla.h:

typedef enum { 
entero, 
real, 
caracter, 
arrayEntero, 
arrayReal, 
arrayCaracter, 
matrizEntero, 
matrizReal, 
matrizCaracter, 
desconocido, 
no_asignado 
} dtipo ; 

typedef struct{ 
int atrib ; 
char *lexema ; 
dtipo tipo ; 
} atributos; 

#define YYSTYPE atributos 

我試了下:

從parser.y,在規則中,試圖訪問yylval.tipo,沒問題。

從lexico.l,令牌規則中,試圖訪問yylval.lexema(或任何屬性),和gcc說我:

lexico.l: In function ‘yylex’: 
lexico.l:93: error: request for member ‘lexema’ in something not a structure or union 
make: *** [lex.yy.o] Error 1 

什麼建議嗎?

非常感謝,並對我的英語感到抱歉。

回答

0

大衛是正確的,默認情況下YACC給你一個%union指令,但看到這個被轉換爲純C,你可以只窩的結構中有:

%union { 
    struct { 
     int atrib; 
     char *lexema; 
     dtipo tipo; 
    }; 
} 

它可以像支持工會內部匿名結構的C語言一樣簡單地工作(例如C99)。

-2

我不完全理解你如何使用結構atributos,但我會猜測。

看看您生成的y.tab.h文件:我認爲您會看到生成的yylval代碼與您要使用它的方式不兼容。

通常,我將YYSTYPE定義爲聯合,而不是結構。查看野牛%union指令的文檔,爲您的語義值定義數據類型。我想你想是這樣的:

%union { 
    int atrib; 
    char *lexema; 
    dtipo tipo; 
} 
相關問題