كيفية حل البيسون تحذير "... لا يوجد لديه نوع المعلنة"

StackOverflow https://stackoverflow.com/questions/1014619

  •  06-07-2019
  •  | 
  •  

سؤال

تشغيل البيسون على هذا الملف:

%{
    #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;}
;

%%

نصائح أخرى

كذلك الفكر إذا كنت تريد أن تكون أكثر وضوحا مع تخفيضات (إذا كنت تفعل AST annoation, هذا يمكن أن يكون مفيد) ثم يمكنك جعل الخاص بك كومة قيم المؤشرات ومن ثم التعامل مع نوع قيم نفسك.مثل الكثير من عددي أنواع:

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 على المكدس.

عند الانتقال إلى أكثر تعقيدا مترجم الواجهات الأمامية ، فإنه يمكن أن يساعد على بناء AST مثل هذا بحيث عند اجتياز شجرة لديك أفضل البيانات الفوقية و يمكنك أيضا زيادة الترجمة مع ترجمة قبل الدلالي أنواع.ثم أنها تتلخص إلى ورقة للإنتاج مثل معرف خلط lexeme في حق العددية الحمولة.

ليس تفسيرا كاملا, ولكن تحصل على هذه الفكرة.

ويساعد هذا الأمل مع المستقبل البيسون/ليكس الأمامية ينتهي ...

حظا سعيدا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top