Вопрос по – Как решить предупреждение Bison «… не имеет заявленного типа»

41

Запуск Бизона в этом файле:

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

%%

Приводит к предупреждениям вида:

warning: $$ of 'exp' has no declared type.

What does it mean and how do I solve it?

+1: для появления первым при поискеbison error has no declared type INS
Просто небольшая ясность. я имею%union { int intValue; int floatValue; } но это не позволяет мне использовать$$.intValue или же$1.intValue, Это говоритerror: request for member ‘floatValue’ in something not a structure or union, Почему так? Shashwat

Ваш Ответ

2   ответа
7

если вы хотите быть более явными со своими сокращениями (если вы делаете аннотацию AST, это может быть удобно), тогда вы можете сделать ваши значения в стеке указателями, а затем обрабатывать значения типов самостоятельно. Очень похоже на скалярные типы с:

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 таким образом, чтобы при обходе дерева у вас были лучшие метаданные и вы могли также дополнить перевод переводами для предсемантических типов. Затем все сводится к вашим конечным произведениям, таким как ID, чтобы перетасовать лексему в правильную скалярную нагрузку.

Не полное объяснение, но вы поняли идею.

Надеюсь, что это поможет с вашими будущими внешними пользователями Bison / Lex и ...

Good Luck

Можете ли вы объяснить это немного больше .. Я не понимаю, как%type работал.
40

льзования. Скорее, вам нужно сообщить Bison, какой член объединения используется каким выражением.

Это сделано сдиректива типа%.

Фиксированная версия кода:

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

%%
Небольшая точка: обозначение%type<val> exp NUM не означает, что конкретное сокращениеexp NUM имеет типval; это означает, чтоexp имеет типVAL а такжеNUM имеет типval, Этот опубликованный ответ, кстати, более полезен, чем официальная документация для директивы type, в которой нет примеров.

Похожие вопросы