parsing yylval और संघ




yacc bison (2)

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


union का उद्देश्य फ्लेक्स द्वारा उत्सर्जित नोड्स में विभिन्न प्रकार की वस्तुओं को संग्रहीत करने की अनुमति देना है

उदाहरण के लिए आपको बेहतर समझने के लिए:

%union
{
    int intValue;
    float floatValue;
    char *stringValue;
}

यदि आप int , float और string प्रकारों के लिए बुनियादी समर्थन प्रदान करना चाहते हैं। आप इस के साथ क्या कर सकते हैं?

दो चीज़ें:

सबसे पहले, टोकन जेनरेट करते समय आप स्वचालित रूप से सही मान सेट कर सकते हैं। पिछली उदाहरण के .l फ़ाइल के बारे में .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;
}

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

nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 }

आखिरकार यदि आप ओओपी सिंटैक्स पेस्ट का उपयोग करने की योजना बनाते हैं तो आप संघ को परिभाषित कर सकते हैं

%union
{
    class ASTNode *node;
}

जिसमें ASTNode किसी भी प्रकार की वाक्यविन्यास नोड का पूर्ववर्ती वर्ग है।


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

bison मैनुअल बताता है :

एक साधारण (गैर-प्रवाहित) पार्सर में, टोकन का अर्थ मूल्य वैश्विक वैरिएबल 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 में कोड इस तरह yylex सकता है:

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






lexical-analysis