ブール式と算術式の文法を作成しました。次のような算術式を処理したい:
(1+5)+(-3)
必要なすべての式を処理できます。
私の問題は、ブール式が次のようになる可能性があることです。
( ( (2+2==4) or (3>2) ) and 2==2)
そのため、ある時点で、ブール規則が算術式規則を参照する必要があります。文法があいまいになるため、ブール規則で括弧 () を使用できません。理由はわかりますが、この問題の解決策がわかりません。
ブール式と算術式の文法を作成しました。次のような算術式を処理したい:
(1+5)+(-3)
必要なすべての式を処理できます。
私の問題は、ブール式が次のようになる可能性があることです。
( ( (2+2==4) or (3>2) ) and 2==2)
そのため、ある時点で、ブール規則が算術式規則を参照する必要があります。文法があいまいになるため、ブール規則で括弧 () を使用できません。理由はわかりますが、この問題の解決策がわかりません。
GOLD 用に書かれたこの LALR 文法は、あなたを始めるのに役立つはずです:
<Formula> ::= <BoolConcat> <Formula> | <BoolConcat>
<BoolConcat> ::= <BoolConcat> 'and' <Comparison> | <Comparison>
<Comparison> ::= <Comparison> '>' <Expression> | <Expression>
<Expression> ::= <Expression> '+' <Term> | <Term>
<Term> ::= <Term> '*' <Fact> | <Fact>
<Fact> ::= Integer | '(' <BoolConcat> ')'
bool 部分では、算術文法の典型的な概念が再利用されます。新しいものは何もありません。さまざまな種類のブール演算子の新しいレベルの優先順位のみです。
「==」を「比較」に追加するだけで、「or」を BoolConcat などに追加できます。