Другой способ сделать это (с помощью кода):
В 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;
}
Там вы можете настроить, какой вид показывать.
Определенное объединение (% 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;}
;
%%
В качестве дополнительной мысли, если вы хотите быть более явным с вашими сокращениями (если вы делаете аннотацию 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. и ...
Удачи