То, как решить Бизона, предупреждающего “…, не имеет никакого заявленного типа”

Другой способ сделать это (с помощью кода):

В AppDelegate вашего приложения (если ваше приложение было создано как универсальное приложение) вы можете найти следующий код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        //iPad...

    } else {
        //iPhone and iPod Touch...

    }

    return YES;
}

Там вы можете настроить, какой вид показывать.

43
задан svick 21 December 2014 в 17:55
поделиться

2 ответа

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

Это делается с помощью директивы % type .

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

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

%%
42
ответ дан 26 November 2019 в 23:07
поделиться

В качестве дополнительной мысли, если вы хотите быть более явным с вашими сокращениями (если вы делаете аннотацию 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. и ...

Удачи

7
ответ дан 26 November 2019 в 23:07
поделиться
Другие вопросы по тегам:

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