$ n(野牛的规则)返回前一个令牌读取的值

时间:2013-11-03 00:43:59

标签: c parsing bison

我的.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”

有谁知道为什么会发生这种情况?

提前致谢!

1 个答案:

答案 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将修复它。