bison wild बाइसन चेतावनी को कैसे हल करें "" कोई घोषित प्रकार नहीं है




wild ox (2)

एक और विचार के रूप में, यदि आप अपने रिडक्शन के साथ अधिक स्पष्ट होना चाहते हैं (यदि आप एएसटी अनाउंसमेंट कर रहे हैं, तो यह आसान हो सकता है) तो आप अपने स्टैक वैल्यू को पॉइंटर्स बना सकते हैं और फिर टाइप वैल्यूज़ को स्वयं संभाल सकते हैं। स्केलर प्रकार के साथ बहुत कुछ:

struct myScalar {
    union {
        int num;
        char *id;
        char *float_lexeme;
    }payload;

    enum {
        TYPE_NUM,
        TYPE_IDENTIFIER,
        TYPE_FLOAT_CHAR
    } type;
    char *orig_lexeme;
};

और स्टैक के लिए एक typedef और scalar_val *val

जब आप अधिक जटिल कंपाइलर फ्रंट-एंड पर जाते हैं, तो यह आपके एएसटी को इस तरह से बनाने में मदद कर सकता है ताकि जब आप उस पेड़ को पार कर लें जो आपके पास बेहतर मेटा-डेटा हो और आप पूर्व-शब्दार्थ प्रकारों के लिए अनुवाद के साथ अनुवाद को भी बढ़ा सकें। फिर यह आपके लीफ प्रोडक्शंस जैसे कि आईडी से लेक्मे को सही स्केलर पेलोड में फेरबदल करने के लिए उबालता है।

पूर्ण व्याख्या नहीं है, लेकिन आपको विचार मिलता है।

आशा है कि यह आपके भविष्य के बाइसन / लेक्स फ्रंट-एंड और ...

शुभ लाभ

इस फ़ाइल पर रनिंग बाइसन:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%%

exp :   NUM     {$$.val = $1.val;}
    | ID        {$$.val = vars[$1.name];}
    | exp '+' exp   {$$.val = $1.val + $3.val;}
    | ID '=' exp    {$$.val = vars[$1.name] = $3.val;}
;

%%

इस तरह की चेतावनियों की ओर जाता है:

चेतावनी: $ $ 'exp' का कोई घोषित प्रकार नहीं है।

इसका क्या मतलब है और मैं इसे कैसे हल करूं?


परिभाषित किया गया संघ (% संघ) सीधे इस्तेमाल किए जाने का इरादा नहीं है। बल्कि, आपको बाइसन को यह बताने की जरूरत है कि संघ का कौन सा सदस्य किस अभिव्यक्ति का उपयोग करता है।

यह % प्रकार के निर्देश के साथ किया जाता है।

कोड का एक निश्चित संस्करण है:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%type<val> exp NUM
%type<name> ID

%%

exp :   NUM     {$$ = $1;}
    | ID        {$$ = vars[$1];}
    | exp '+' exp   {$$ = $1 + $3;}
    | ID '=' exp    {$$ = vars[$1] = $3;}
;

%%