Pergunta

Running Bison sobre este arquivo:

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

%%

Leads para advertências do tipo de:

aviso:. Tipo $$ de 'exp' não tenha declarado

O que significa e como posso resolver isso?

Foi útil?

Solução

A união (% união) definida não se destina a ser utilizada directamente. Em vez disso, você precisa dizer a Bison qual membro da União é utilizada pelo qual expressão.

Isto é feito com a % digitar directiva .

A versão fixa do código é:

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

%%

Outras dicas

Como mais um pensamento, se você quiser ser mais explícito com suas reduções (se você estiver fazendo AST annoation, isso pode ser útil), então você pode fazer seus valores pilha ponteiros e depois lidar com valores de tipo si mesmo. Muito parecido com tipos escalares com:

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

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

E ter um typedef e scalar_val *val para a pilha.

Quando você passar para front-ends de compilador mais complexas, pode ajudar a construir o seu AST como esta para que quando você percorrer a árvore você tem melhores meta-dados e você também pode aumentar a tradução com traduções para tipos de pré-semânticas . Em seguida, ele se resume a suas produções de folhas, como ID para baralhar o lexeme para o payload escalar direita.

Não uma explicação completa, mas você começa a idéia.

Espero que isso ajude com o seu futuro front-ends Bison / Lex e ...

Good Luck

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top