.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" を返します。
なぜこれが起こっているのか誰にも分かりますか?
前もって感謝します!