1

宿題の問題があり、助けが必要です。次の EBNF ステートメントを BNF に変換する必要があります

<S> -> <A>{b<A>}
<A> -> a[b]<A>

これが私がこれまでに思いついたことです。

<S> -> <A> | <A><S> | b<A>
<A> -> a<A> | ab<A>

主にWAGであるため、気分が良くありません。私の本 (Concepts of Programming Languages、Sebesta) の例は、まったく役に立ちません。ですから、誰かが洞察を持っているなら、それは大歓迎です。ありがとう!

4

2 に答える 2

1

最初の文法はバグがあるか、少なくとも不必要に面倒です。ただし、EBNF を BNF に変換する機械的な方法については、こちらをご覧ください。

http://lampwww.epfl.ch/teaching/archive/compilation-ssc/2000/part4/parsing/node3.html

于 2010-06-21T06:06:01.837 に答える
1

の変換は<S>完全に正しくありません:

<S> -> <A> | <A><S> | b<A>

元の EBNF ルールで定義されていないものを<A>持たずに再帰的に選択できるため(その前にのみ再帰的に使用できます)b<A>b

解決策は次のとおりです。

(* S は A のシーケンスであり、オプションで b と S のシーケンスが続きます。*)

<S> -> <A>
       | <A> b <S>;

(* A は、'a' の後にオプションの 'b' が続き、その後に別の A が続く *)

<A> -> a <A>
       | a b <A>;

これが、私が代わりに EBNF を好む理由です。分かりやすく書きやすい!:-)

最終的には、何が必要かを自問します。それを書き留め。ここで、オプションのコンポーネントを検討し、それらを必要なコンポーネントとさまざまに組み合わせて使用​​します (もちろん、正しい順序で)。次に、できることを減らします(間違えないように注意してください)。

于 2013-07-20T21:12:04.160 に答える