2

私のコンパイラ コースの割り当ての言語では、括弧のない式で混合演算子を使用することはできません。これは、次の式が有効であることを意味します。

# 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 -> exprTNumber -> term -> addexpr -> expr

私の考えでは、ルールを追加してexpr : term;から、どういうわけか2つ以上の用語を作成addexprして要求する必要がありますが、これを表現する方法がわかりません。mulexpr

更新:有効なソリューションを見つけましたが、「コード」の重複が少ないソリューションがあれば、受け入れられます。

4

1 に答える 1