Como resolver aviso Bison “... não tem nenhum tipo declarado”
-
06-07-2019 - |
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?
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