2009-12-05 7 views
14

yacc फ़ाइल में संघ का उद्देश्य क्या है? क्या यह सीधे फ्लेक्स फ़ाइल में यिलवल से संबंधित है? यदि आप यिलवाल का उपयोग नहीं करते हैं, तो आपको संघ का उपयोग करने की आवश्यकता नहीं है?यिलवाल और संघ

उत्तर

11

%union घोषणा yylval के प्रकार को संशोधित करती है।

मैनुअल bisonexplains:

एक साधारण (nonreentrant) पार्सर में, टोकन का अर्थ मूल्य वैश्विक चर yylval में संग्रहित किया जाना चाहिए। जब आप अर्थपूर्ण मानों के लिए केवल एक डेटा प्रकार का उपयोग कर रहे हैं, तो yylval में वह प्रकार है। इस प्रकार, यदि प्रकार int (डिफ़ॉल्ट) है, तो आप इस yylex में लिख सकते हैं:

... 
yylval = value; /* Put value onto Bison stack. */ 
return INT;  /* Return the type of the token. */ 
... 

जब आप एक से अधिक डेटा प्रकार का उपयोग कर रहे हैं, yylval के प्रकार एक संघ %union घोषणा से बनाया गया है (देखें अनुभाग मूल्य प्रकार का संग्रह)। तो जब आप टोकन के मूल्य को स्टोर करते हैं, तो आपको संघ के उचित सदस्य का उपयोग करना होगा। %union घोषणा इस तरह दिखाई देता है:

%union { 
    int intval; 
    double val; 
    symrec *tptr; 
} 

तो yylex में कोड इस प्रकार दिखाई देंगे:

... 
yylval.intval = value; /* Put value onto Bison stack. */ 
return INT;   /* Return the type of the token. */ 
... 
21

union के प्रयोजन उत्सर्जित नोड्स में वस्तुओं की अलग तरह का भंडारण की अनुमति देना है फ्लेक्स द्वारा यदि आप int, float और string प्रकार के लिए बुनियादी समर्थन प्रदान करना चाहते हैं

%union 
{ 
    int intValue; 
    float floatValue; 
    char *stringValue; 
} 
.y में

:

बेहतर व्याख्या करने के लिए आप उदाहरण के लिए हो सकता है। आप इसके साथ क्या कर सकते हैं?

दो बातें:

सबसे पहले, आप स्वचालित रूप से सही मान जब टोकन पैदा करने के लिए सेट कर सकते हैं। पिछले उदाहरण के .l के बारे में फ़ाइल के बारे में सोचो, तुम हो सकता है:

[a-zA-Z][a-zA-Z0-9]* { 
yylval.stringValue = strdup(yytext); 
return IDENTIFIER; 
} 

[0-9]+ { 
yylval.intValue = atoi(yytext); 
return INTEGER; 
} 

[0-9]*\.[0-9]+"f"? { 
    yylval.floatValue = new atof(yytext); 
return FLOAT; 
} 

इसके अलावा आप अपने फ्लेक्स व्याकरण में सीधे मान का उपयोग कर सकते हैं: अगर आप एक OOP सिंटैक्स का उपयोग करने की योजना

nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 } 
अंत में

के रूप में

%union 
{ 
    class ASTNode *node; 
} 

जो ASTNode में एस के किसी भी तरह के पूर्वज वर्ग है पेड़ आप संघ को परिभाषित कर सकते yntax नोड।

+3

एक तत्व के संघ को परिभाषित क्यों करें? क्यों न केवल YYSTYPE वर्ग एएसटीएनओडी * परिभाषित करें * (अगर स्मृति कार्य करता है)। –

संबंधित मुद्दे