私のコンパイラ コースの割り当ての言語では、括弧のない式で混合演算子を使用することはできません。これは、次の式が有効であることを意味します。
# Valid
1 + 2 + 3
1 + (2 * 3)
1
しかし、これはそうではありません:
# Invalid
1 + 2 * 3
空の式でもありません。私の実際の文法から抜粋すると、式は次のように解析されます。
%token TNumber
%start expr
%%
expr : mulexpr
| addexpr
;
mulexpr : mulexpr '*' term
| term
;
addexpr : addexpr '+' term
| term
;
term : '(' expr ')'
| TNumber
;
ただし、これはreduce/reduceの競合で爆発します。単項式likeが, orに123
還元できるからだと思いますが、よくわかりません。あいまいさが私が思っているとおりであることを期待するよりも、文法を明確にすることを好みます。ただし、このあいまいさを解決する方法は思いつきません。TNumber -> term -> mulexpr -> expr
TNumber -> term -> addexpr -> expr
私の考えでは、ルールを追加してexpr : term;
から、どういうわけか2つ以上の用語を作成addexpr
して要求する必要がありますが、これを表現する方法がわかりません。mulexpr
更新:有効なソリューションを見つけましたが、「コード」の重複が少ないソリューションがあれば、受け入れられます。