web-dev-qa-db-ja.com

曖昧な文法を曖昧でないものに変換する

曖昧な文法から曖昧でない文法がどのように派生するのか理解できませんでしたか?サイトの例を考えてみましょう: 。文法がどのように導き出されたかは私を混乱させます。

誰でも私を案内してもらえますか?

23
name_masked

この例には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であれば何でも構いませんが、文法には左右の選択肢を決定する根拠がありません。

そのため、この文法は本質的に曖昧であり、私の推定では、明確にすることはできません。確かに、私たちが所有していない他の情報がなければ、明確にすることはできません。

εは空の文字列ではありません

Εが空の文字列でない場合はどうですか?

  • Bはεまたはaεです。
  • AはaまたはBで、その後にaが続きます(aまたはaεまたはaaε)。
  • いずれか:Sはaに続くaです(したがってaa、aaε、またはaaaε)
  • または:SはBで、その後にaが続きます(したがって、εaまたはaεa)。

この場合、文法はそのままで明確です(必ずしもLR(1)とは限りません)。明らかに、コメント/質問の「イプシロン」の意味に大きく依存します。

連想性

連想性がこの文法に影響するとは思わない。一般に、中置演算子(「a + b」の「+」など)とともに使用されます。

47

ウィキペディアから( 曖昧な文法の認識 ):

一部のあいまいな文法はあいまいでない文法に変換できますが、あいまいな文法を検出するアルゴリズムが存在しないのと同様に、これを行うための一般的な手順は不可能です。

2番目の文法を思い付くには、次の文法を見つける必要があります。

  1. 最初のものと同等:両方が同じ言語を生成します
  2. 明確:言語のすべての文について、解析ツリーは一意です
9
Dave O.