現在、bison は 8 つの reduce/reduce 競合を発見しました。行を削除すると
| '-' E %prec UMINUS {$$=-$2;}
ありません。優先順位と連想プロパティは明確に定義されていると思います。誰かが競合を解決する方法を教えてもらえますか?
これで問題が解決するはずです:
%union{
string *s;
float num;
}
%token div_token mod_token sqrt_token it_token abs_token
%token <num> num_token
%token <s> Stampa
%type <num> E
%left '+' '-'
%left '*' '/' div_token mod_token
%left UMINUS
%left abs_token sqrt_token
%%
Program: Program Line '\n' { }
| Line '\n' { }
;
Line: Stampa {cout<<*$1<<endl;}
| E {cout<<$1<<endl; broj = $1;}
| it_token {cout<<broj<<endl;}
;
E: E '+' E {$$ = $1 + $3;}
| E '-' E {$$ = $1 - $3;}
| E '*' E {$$ = $1 * $3;}
| E '/' E {if($3!=0)
$$ = $1 / $3;
else
yyerror("Deljenje nulom");
}
| E mod_token E {$$ = (float)((int)$1 % (int)$3);}
| E div_token E {$$ = (float)((int)($1 / $3));}
| sqrt_token E { $$ = sqrt($2); }
| '(' E ')' {$$=$2;}
| abs_token E { $$ = abs($2);}
| '-' %prec UMINUS E {$$=-$2;}
| num_token {$$ = $1;}
;
これにより、いくつかの問題が修正されます。あなたはおそらく次のことを意味していました:
| E mod_token E {$$ = (float)((int)$1 % (int)$3);}
| E div_token E {$$ = (float)((int)($1 / $3));}
そして、次のように書くとより明確になります。
| '-' %prec UMINUS E {$$=-$2;}
-v
以下を生成するbison オプションとの競合を確認できますxyz.output
。
state 35
6 E: E . '+' E
7 | E . '-' E
7 | E '-' E .
8 | E . '*' E
9 | E . '/' E
15 | '-' E
.
div_token reduce using rule 7 (E)
div_token [reduce using rule 15 (E)]
mod_token reduce using rule 7 (E)
mod_token [reduce using rule 15 (E)]
sqrt_token reduce using rule 7 (E)
sqrt_token [reduce using rule 15 (E)]
abs_token reduce using rule 7 (E)
abs_token [reduce using rule 15 (E)]
num_token reduce using rule 7 (E)
num_token [reduce using rule 15 (E)]
'+' reduce using rule 7 (E)
'+' [reduce using rule 15 (E)]
'-' reduce using rule 7 (E)
'-' [reduce using rule 15 (E)]
'*' reduce using rule 15 (E)
'/' reduce using rule 15 (E)
'\n' reduce using rule 15 (E)
'(' reduce using rule 7 (E)
'(' [reduce using rule 15 (E)]
')' reduce using rule 15 (E)
$default reduce using rule 7 (E)
オペレーターは を縮小しdiv_token
、mod_token
疑いがあります。文法のあいまいさは、これらの演算子が 2 つの式に適用されるために発生しますE
。
編集
おそらく、接頭辞 div および mod 演算子を保持しようとしているでしょう。もしそうなら、文法を明確にする必要があります。考えられる解決策の1つは次のとおりです。
| mod_token F F {$$ = (float)((int)$2 % (int)$3);}
| div_token F F {$$ = (float)((int)($2 / $3));}
| F
;
F: '(' E ')' {$$=$2;}
| sqrt_token E { $$ = sqrt($2); }
| abs_token E { $$ = abs($2);}
| '-' %prec UMINUS E {$$=-$2;}
| num_token {$$ = $1;}
;
次のタイプを追加しF
ます。
%type <num> E F