私は、テキストファイルの式の数(1行に1つ)を解決する算術式の文法を持っています。 YACCをコンパイルしている間に、私はメッセージ2シフトが競合を減らすようになっています。しかし、私の計算は適切です。パーサが適切な出力を与えている場合、どのようにシフト/コンフリクトの競合が解決されますか?そして私の場合、YACC文法でそれを解決する方法はありますか?パーサーはシフト/リダクションの競合をどのように解決しますか?
YACC文法
Calc : Expr {printf(" = %d\n",$1);}
| Calc Expr {printf(" = %d\n",$2);}
| error {yyerror("\nBad Expression\n ");}
;
Expr : Term { $$ = $1; }
| Expr '+' Term { $$ = $1 + $3; }
| Expr '-' Term { $$ = $1 - $3; }
;
Term : Fact { $$ = $1; }
| Term '*' Fact { $$ = $1 * $3; }
| Term '/' Fact { if($3==0){
yyerror("Divide by Zero Encountered.");
break;}
else
$$ = $1/$3;
}
;
Fact : Prim { $$ = $1; }
| '-' Prim { $$ = -$2; }
;
Prim : '(' Expr ')' { $$ = $2; }
| Id { $$ = $1; }
;
Id :NUM { $$ = yylval; }
;
私は私の文法で、このような矛盾を取り除くためにどのような変更を行う必要がありますか?
私はこのことを使ってシフト/リダクションの矛盾を解消しましたが、この行がテキスト全体を考慮する新しい行を持つ新しいテキストを持つテキストファイルを持っています単一の方程式として使用することができ、ユーザーは式でuse()を使用することも使用しないこともできます。 –
@nikul:そうですね、式文法をそのまま残して、改行トークンを返すように字句スキャナを変更すると、改行で区切られた 'Calc'を使うことができます。 – rici
あなたも見たいかもしれませんhttp://stackoverflow.com/a/42093276/1566221で、コードをコピーしないでください:OPのコードには多くの問題があります(そうでなければ彼は質問しませんでした:))。私の答えは演算子の優先順位の問題。しかし、それは正しく改行を行います。 – rici