2009-09-16 14 views
15

मैं बाइसन के साथ संघ के हिस्से के रूप में एक struct शामिल करने के लिए कोशिश कर रहा हूँ के साथ% संघ डीईएफ़ में struct शामिल हैं, लेकिन मैं% संघ में 'struct नोड आर्ग' पर एक त्रुटि प्राप्त:बाइसन/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 आउटपुट पर आता है।

आपको यह सुनिश्चित करके इसे ठीक करने की आवश्यकता है कि "struct node" को कहीं भी y.tab.h शामिल करने से पहले परिभाषित किया गया है।

ऐसा करने के लिए संरचना परिभाषा के साथ एक फ़ाइल node.h बनाएँ।

फिर अपने parser.l फ़ाइल में y.tab.h से पहले node.h शामिल करें, parser.y फ़ाइल के साथ-साथ आपके पास मौजूद किसी भी सी फाइलों में y.tab.h शामिल है। यह थोड़ा परेशान है।

वैकल्पिक रूप से आप "स्ट्रक्चर नोड तर्क" को "स्ट्रक्चर नोड * तर्क" में बदल सकते हैं क्योंकि आपको इसे पूर्ण प्रकार तक जानने की आवश्यकता नहीं होगी जब तक कि आप इसे कहीं भी उपयोग न करें। सुनिश्चित नहीं है कि यह आपके कोड के साथ फिट होगा या नहीं।

किसी को भी काम करना चाहिए।

22

और भी बेहतर, "की आवश्यकता है" विकल्प के साथ% कोड के निर्देश का उपयोग करें, अर्थात्: में पार्सर के रूप में tab.h फ़ाइल में ब्लॉक "की आवश्यकता है" के रूप में अच्छी

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

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

इस कोड में शामिल होंगे मूल फाइल।

प्रलेखन से: http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  • की आवश्यकता है
    • उद्देश्य: यह सबसे अच्छी जगह निर्भरता YYSTYPE और YYLTYPE के लिए आवश्यक कोड लिखने के लिए है। दूसरे शब्दों में, % यूनियन निर्देशों में संदर्भित को परिभाषित करने के लिए यह सबसे अच्छी जगह है, और बायिसन की डिफ़ॉल्ट 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...

लिख सकते हैं