web-dev-qa-db-ja.com

左ファクタリングと左再帰の違い

違いは何ですか Left FactoringおよびLeft Recursion?という事は承知しています Left factoringは、予測トップダウン解析手法です。しかし、これら2つの用語を聞くと混乱します。

29
saplingPro

左の因数分解は、同じ非終端の2つの生成で現れる一般的な左の因子を削除します。パーサーによるバックトレースを回避するために行われます。パーサーに先読みがあるとします。この例を検討してください-

A-> qB | qC
A、B、Cは非終端記号、qは文です。この場合、2つのプロダクションのどちらを選択するかについてパーサーが混乱し、バックトレースが必要になる場合があります。左の因数分解の後、文法は次のように変換されます:

A-> qD

D-> B | C

この場合、先読み機能を備えたパーサーは常に適切なプロダクションを選択します。

左再帰は、非終端の生成の左端の非終端が非終端自体である場合(直接左再帰)または他の非終端の定義を介して、非終端に再度書き直される場合(間接)左再帰)。これらの例を考慮してください-

(1)A-> Aq(直接)

(2)A-> Bq B-> Ar(間接)

パーサーがトップダウン解析を実行する場合、左再帰を削除する必要があります

47
nina

Left Factoringは文法変換技術です。これは、2つ以上のプロダクションに共通の「ファクタリングアウト」プレフィックスで構成されます。

たとえば、

A→αβ| αγ

に:

A→αA '

A '→β| γ


左再帰は、特定の変数(非終端)から同じ変数で始まるrhsを1つ以上のステップで派生できる場合に、文法が持つプロパティです。

例えば:

A→Aα

または

A→Bα

B→Aγ

Elimination of left recursionと呼ばれる文法変換手法があります。これは、左再帰文法が与えられた場合、同等であり再帰的ではありません。


両方の用語の関係/混乱は、予測トップダウンパーサーを導出する前に、両方の変換手法を文法に適用する必要があるかもしれないという事実に由来する可能性があります。

22
user3761508

これは、2つの用語が使用されているのを見た方法です。

  1. 左再帰:トークンを消費せずに1つ以上のプロダクションに自分自身から到達できる場合。
  2. 左ファクタリング:文法を左再帰形式から同等の非左再帰形式に変換する変換プロセス。

左の要因:

与えられた文法をみましょう:A-> ab1 | ab2 | ab3

1)すべてのプロダクションには共通のプレフィックスがあり、ここでプロダクションを選択した場合、バックトラックする必要がないことは確認されていません。
2)決定論的ではありません。プロダクションを選択することができず、正しい解析ツリーを作成して目的の文字列に到達することが保証されるためです。しかし、決定論的な方法で文法を書き直し、バックトラッキングなしで可能な任意の文字列に変換するのに十分な柔軟性を残した場合、次のようになります。

A-> aA '、A'-> b1 | b2 | b3

文字列ab2の解析ツリーを作成するように求められた場合、バックトラッキングは必要ありません。 A 'を取得するときは常に正しい生成を選択できるため、正しい解析ツリーを生成します。

左再帰:

A-> Aa | bここで、最初のプロダクションを選択した場合、Aの左の子は常にAになることは明らかです。これは左再帰です。なぜなら、Aは何度も何度も自分自身を呼び出しているからです。この文法から生成された文字列は:ba *です。これは、文法に含めることができないためです。..を記述することにより、左再帰を削除します。

A-> bA 'A'-> E | aA 'これで、再帰を残さず、ba *を生成できます。

7
Mushrit Shabnam

左再帰:文法に派生が存在するような非終端Aがある場合、文法は再帰的に残されますA->Aα|βここで、αとβは終端と非終端のシーケンスですAで始まらない.

トップダウンパーサーの設計中に、文法に左再帰が存在する場合、パーサーは無限ループに入ります。これは、AがA自体に一致しようとしているため不可能です。問題のあるプロダクションを書き換えることにより、上記の左再帰を排除できます。として-

A->βA '

A '->αA' |イプシロン

左ファクタリング:文法の非決定性を排除するには、左ファクタリングが必要です。文法S-> abS | aSbと仮定します

ここで、Sは、非決定論に従う生産規則(Sの2つの代替選択肢)で同じ端末aを導出しています。 Sの決定を延期するように生産を書き直すことができます。

S-> aS '

S '-> bS | Sb

したがって、S 'はbSまたはSbに置き換えることができます

3
mogg

左再帰:=左手非ターミナルが右手非ターミナルと同じ場合。例:A-> A&| B(&はアルファ)。このプロダクションを次のように書き換えて、左のリコーションを削除できます。

A-> BA 'A'->&A '|€

左因子は、productnが非決定的であってはならないことを意味します。 。例:A->&A |&B |&C

0
Yogendra Sharma