2

.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

私のイレックス:

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 は T_ID に関連するセカンダリ トークンではなく、以前の token1 の値を返します。

例: このシーケンス "1 42 2 33" は一致しますが、$1 は "39" を返します。

なぜこれが起こっているのか誰にも分かりますか?

前もって感謝します!

4

1 に答える 1

0

回答をコメント内ではなく回答にするために(@librik経由):

ではyylex、 に割り当てられる値はyylvalではなくである必要がありyyvalます。

yyvalセマンティック アクションの左側の現在の値を格納します。 yylval現在読み取られているトークンの値を格納します。

どちらも同じ型 (YYSTYPE) であるため、割り当てを間違えてもエラーにはなりません。

yylvalに設定しないyylex場合、 yylval の値は、設定された最後のトークンによって読み取られた値を保持します(あなたの場合、T_INT_CONST/T_REAL_CONST/T_BOOL_CONST/T_ID ではなかった最後のトークン読み取り)。したがって、yyval の代わりに yylval を使用すると修正されます。

于 2013-11-03T03:10:28.617 に答える