こんにちは、本にこの質問があります
このグラマーを考えると
A --> AA | (A) | epsilon
a- 生成するもの\
b- あいまいな表示
今私が考える答えは
a- 隣接括弧
b- 異なる解析ツリーを生成するため、あいまいで、2 つのシナリオを示す描画を行いました。
これは正しいですか、それともより良い答えがありますか?
a)ほぼ正しい...
この文法は、バランスの取れた括弧で構成された文字列のセットを正確に生成します。その理由を理解するために、簡単なデモンストレーションを試してみましょう。
まず、文法から外れるものはすべて、バランスの取れた括弧文字列です。なぜですか?、単純な誘導:
2番目:バランスの取れた文字列のすべてのセットは、文法によって生成されます。文字列のサイズを誘導してやってみましょう。
例えば: (()())(())
この文字列は、デモンストレーションのアイデアを正確に使用して生成できます。
A-> AA->(A)A->(AA)A->((A)(A))A->(()())A->(()())(A)->( ()())((A))->(()())(())
b)もちろん、左右の再帰はあいまいであると言うのに十分ですが、特にこの文法があいまいである理由を確認するには、デモンストレーションについて同じ考えに従ってください。
最短のバランスの取れたプレフィックスを取る必要がないため、あいまいです。文字列のサイズではない最長のバランスの取れた(または一般的にはバランスの取れたプレフィックス)を取ることができ、デモンストレーション(および生成)は同じプロセスに従います。
元: (())()()
A-> AAを選択し、最初のAで(())部分文字列、または(())()部分文字列を生成できます。
はい、あなたは正しいです。
それが曖昧な文法の意味です。
あいまいな文法の問題は、コンパイラを作成していて、コードの特定の行 (またはそのようなもの) の各トークンを識別したい場合、あいまいさが「2 つの説明」を持っているため、識別する際に混乱することです。コード行。
パート B に対するあなたのアプローチは正しいように思えます。文法で定義された言語で、同じ文字列に対する 2 つの独立した派生を示しています。
ただし、パートAへの回答には少し作業が必要だと思います。明らかに、2 番目の節を再帰的に使用して (((((epsilon))))) のような文字列を取得できますが、最初の節と 2 番目の節を一緒に使用すると、他のタイプの派生が可能です。