私はプログラミング言語のコンパイラと概念について学んでいます。 どのように翻訳できますか?私はEBNFからBNFへの翻訳に苦労しています
問題:まず
<S> → (+ | -)[<C>]{<A>}
、私はこのように翻訳:
<S> -> epsilon
| +<S>
| -<S>
| <C><S>
| <A><S>
しかし、それはCを再現することができないという問題があります!
私はプログラミング言語のコンパイラと概念について学んでいます。 どのように翻訳できますか?私はEBNFからBNFへの翻訳に苦労しています
問題:まず
<S> → (+ | -)[<C>]{<A>}
、私はこのように翻訳:
<S> -> epsilon
| +<S>
| -<S>
| <C><S>
| <A><S>
しかし、それはCを再現することができないという問題があります!
あなたのBNFバージョンは、複数の<C>
を生成するだけでなく、複数の+
と-
(または、元の文法とは異なる場合もあります)を複数生成することができます。
これらの問題を解決するには、非端末を追加する必要があります。具体的には、{<A>}
と一致するものと[<C>]
と一致するものを持つことができます。 <S>
のあなたの定義は、その後、次のようになります。
<S> -> + <OptionalC> <RepeatedA>
| - <OptionalC> <RepeatedA>
あなたのEBNFの元は<S>
には再帰的ではありませんが、あなたのトライアルBNFです。 BNFに同じ言語を生成させたい場合は、そうしないでください。また、あなたのEBNFはepsilon
を生成することができないので、それをあなたの<S>
の生産に加えてはいけません。その他の回答として
あなたは追加の非端末を導入する必要がある、と言う:
<S> -> <plusminus> <optionalC> <repeatedA>
<plusminus> -> + | -
<optionalC> -> <C> | epsilon
<repeatedA> -> <A> <repeatedA> | epsilon
これはあなたの元の文法でEBNF要素の簡単な訳です。追加の要件(イプシロン除去など)があっても、この種のステップから開始する必要があります。
<S>
ルールは再帰的ではありません。また、追加の非終端記号にはepsilon
が使用されていますが、<S>
または<plusminus>
の規則の一部ではないため、EBNFオリジナルのように<S>
は生成できません。
あなたの質問は不明です。 *何が* C *を作り出すことができ、なぜそれが悪いのですか?あなたが得た答えを生み出す段階と各段階の正当性を示したら、本当に役に立ちます。 –