曖昧な文法から曖昧でない文法がどのように派生するのか理解できませんでしたか?サイトの例を考えてみましょう: 例 。文法がどのように導き出されたかは私を混乱させます。
誰でも私を案内してもらえますか?
この例には2つの文法があります。
E → E + E | E ∗ E | (E) | a
E → E + T | T
T → T ∗ F | F
F → (E) | a
曖昧でない文法は、曖昧な文法で指定されていない情報を使用して曖昧な文法から派生しました。
外部情報により、次のことがわかります。
a * a + b * b
書かれているかのようにグループ化されます:
(a * a) + (b * b)
としてではなく:
a * ((a + b) * b)
2番目は、「+」が「*」よりも強くバインドし、演算子が左から右ではなく右から左にバインドすることを前提としています。
次のような例の場合、結合性はどのように現れますか
S → aA | Ba
A → BA | a
B → aB | epsilon
これは曖昧な文法なので、どのように曖昧さのないように変換するのでしょうか?
「イプシロン」がε、空の文字列なのかしら。両方の方法で文法を分析しましょう。
Bのルールでは、Bは空の文字列か、有効なBが続くaのいずれかであり、0以上のaの無期限に長い文字列になります。
Aのルールでは、AはaまたはBの後にaが続くと述べています。したがって、aの無制限に長い文字列もAになる可能性があります。したがって、aの文字列がAかBかを選択する方法はありません。
また、Sのルールは役に立ちません。 Sは、aの後に無期限に長い文字列が続くaか、aの後に無期限に長い文字列が続くかのいずれかです。少なくとも1つのaが必要ですが、1以上のaであれば何でも構いませんが、文法には左右の選択肢を決定する根拠がありません。
そのため、この文法は本質的に曖昧であり、私の推定では、明確にすることはできません。確かに、私たちが所有していない他の情報がなければ、明確にすることはできません。
Εが空の文字列でない場合はどうですか?
この場合、文法はそのままで明確です(必ずしもLR(1)とは限りません)。明らかに、コメント/質問の「イプシロン」の意味に大きく依存します。
連想性がこの文法に影響するとは思わない。一般に、中置演算子(「a + b」の「+」など)とともに使用されます。
ウィキペディアから( 曖昧な文法の認識 ):
一部のあいまいな文法はあいまいでない文法に変換できますが、あいまいな文法を検出するアルゴリズムが存在しないのと同様に、これを行うための一般的な手順は不可能です。
2番目の文法を思い付くには、次の文法を見つける必要があります。