Когда вы используете yylval.ival
, у вас уже есть union
с полем ival
в вашем источнике YACC, например:
%union {
int ival;
}
Теперь вы указываете тип токена, например:
%token <ival> NUMBER
Так что теперь вы можете получить доступ к полю ival
просто для токена NUMBER как $1
в ваших правилах, например
xyz : XYZ NUMBER NUMBER { printf("XYZ %d %d", $2, $3); }
Для вашего второго вопроса я бы определил союз следующим образом:
%union {
char* strval;
int ival;
}
и в вашем LEX-источнике указываются типы токенов
%token <strval> STRING;
%token <ival> NUMBER;
Так что теперь вы можете делать такие вещи, как
foo : STRING NUMBER { printf("%s (len %d) %d", $1, strlen($1), $2); }