2009-09-16 70 views
15

我想包括一個結構與野牛聯盟的一部分,但我在%工會坐上「結構節點ARGS」的錯誤:包括結構在%工會DEF與野牛/ Yacc的

parser.y:17: error: field ‘args’ has incomplete type 

守則:

struct node { 
    char * val; 
    struct node * next; 
}; 

%} 

%union { 
    char * string; 
    struct node args; 
} 

%token <string> CD WORD PWD EXIT 

%type <args> arg_list 

任何人都知道我做錯了嗎?

回答

13

它歸結爲您獲得的蹩腳的y.tab.h輸出。

您需要通過確保在您將y.tab.h包含在任何地方之前定義「struct node」來解決此問題。

爲此,請使用struct定義創建一個文件node.h。

然後在您的parser.l文件,parser.y文件以及任何包含y.tab.h的c文件中的y.tab.h之前包含node.h。這有點煩人。

或者,您可以將「struct node args」更改爲「struct node * args」,因爲除非您在某處使用它,否則不需要知道完整類型。不確定這是否適合您的代碼。

任何一個都應該工作。

22

更妙的是,使用%的代碼指令與「要求」選項,即:

%code requires { 
    struct node { 
     char * val; 
     struct node * next; 
    }; 
} 

%union { 
    char * string; 
    struct node args; 
} 

這將包括在代碼中的「要求」在tab.h文件塊以及解析器源文件。

從文檔:http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  • 需要
    • 目的:這是編寫 YYSTYPE和YYLTYPE所需的相關代碼的最佳場所。換句話說, 這是定義在%union指令中引用的類型 的最佳位置,而 它是覆蓋Baring的默認YYSTYPE和YYLTYPE 定義的最佳位置。
1

也許更簡單的(我認爲) - 這曾經自己:

%union { 
    char c; 
    struct { 
    char name[30]; 
    int type; 
    } s; 
} 

然後,彎曲你可以使用 「yylval.s.name」,或「yylval.s。類型「等。而在野牛,而不是$$=0, $1=bla ...你現在可以寫$<s.type>$=0 , $<s.type>1=bla...