yacc फ़ाइल में संघ का उद्देश्य क्या है? क्या यह सीधे फ्लेक्स फ़ाइल में यिलवल से संबंधित है? यदि आप यिलवाल का उपयोग नहीं करते हैं, तो आपको संघ का उपयोग करने की आवश्यकता नहीं है?यिलवाल और संघ
उत्तर
%union
घोषणा yylval
के प्रकार को संशोधित करती है।
मैनुअल bison
explains:
एक साधारण (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. */ ...
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 नोड।
एक तत्व के संघ को परिभाषित क्यों करें? क्यों न केवल YYSTYPE वर्ग एएसटीएनओडी * परिभाषित करें * (अगर स्मृति कार्य करता है)। –