我的.y上有以下野牛规则:
constant_definition: T_ID T_EQUAL T_INT_CONST T_SEMICOLON
{
if(!insert_const($1, T_INTEGER))
{
printf("ERROR:... ");
}
};
我的令牌:
%token T_ID 1
%token T_EQUAL 42
%token T_INT_CONST 2
%token T_SEMICOLON 33
...
我的工会:
%union
{
int token1;
int token2;
int token_int_value;
float token_float_value;
int token_boolean_value;
}
%type<token2> T_ID
%type<token_valor_real> T_REAL_CONST
%type<token_valor_int> T_INT_CONST
%type<token_valor_boolean> T_BOOLEAN_CONST
我的yylex:
int yylex(void)
{
token token_read = next_token();
switch(token_read .token1)
{
case T_ID :
yyval.token2 = token_read.token2;
break;
case T_INT_CONST:
yyval.token_int_value = token_read.token_int_value;
break;
case T_REAL_CONST:
yyval.token_float_value = token_read.token_float_value ;
break;
case T_BOOLEAN_CONST:
yyval.token_boolean_value = token_read.token_boolean_value ;
break;
default:
yylval.token1 = token_read.token1;
break;
}
return token_read.token1;
}
假设我读取了以下令牌序列(token1): 5 1 33 39 1(4)42 2 33 1(5)42 2 33 ...
有一段时间,野牛的规则匹配,$ 1返回先前的token1的值而不是与T_ID相关的辅助令牌。
例如: 此序列“1 42 2 33”匹配,但$ 1返回“39”
有谁知道为什么会发生这种情况?
提前致谢!
答案 0 :(得分:0)
有兴趣将答案放在答案中而不是在评论中(通过@librik):
在yylex
中,分配的值应为yylval
,而不是yyval
。
yyval
存储语义动作左侧的当前值。
yylval
存储当前读取的令牌的值。
它们都是相同类型(YYSTYPE),因此错误地分配不会引发错误。
如果未在yylval
中设置yylex
,则yylval中的值会保留已设置的最后一个标记所读取的值(在您的情况下,读取的最后一个标记不是一个T_INT_CONST / T_REAL_CONST / T_BOOL_CONST / T_ID)。因此,使用yylval而不是yyval将修复它。