web-dev-qa-db-ja.com

左/右再帰、左/右端の派生、優先順位、結合性などの違い

私は現在言語プロセッサを学んでおり、非常に頻繁に出てくるトピックは、文法の要素が消費される方向です。左から右または右から左。私はその概念を理解していますが、これらのルールを書く方法はたくさんあるようで、それらがすべて同じかどうかはわかりません。私がこれまでに見たものは次のとおりです。

右/左再帰、右/左端の派生、右/左の縮小、優先順位、結合性など。

これらはすべて同じ意味ですか?

9
user3001845

いいえ、それらはすべて異なる意味を持っています。

右再帰と左再帰は、プロダクションルール内の再帰を指します。非終端記号を含むシーケンスを導出できる場合、非終端記号の生成は再帰的です。非終端記号が派生シーケンスの開始(左エッジ)に表示される場合は左再帰であり、終了(右エッジ)に表示される場合は右再帰です。プロダクションは、左再帰または右再帰でなくても再帰的である可能性があり、左再帰と右再帰の両方である可能性もあります。

例えば:

_term: term '*' factor            { /* left-recursive */ }
assignment: lval '=' assignment  { /* right-recursive */ }
_

上記の例は両方とも直接再帰です。非終端記号は、非終端記号を含むシーケンスを直接導出します。再帰は間接的な場合もあります。それはまだ再帰です。

すべての一般的な解析アルゴリズムは左から右に処理します。これはLLとLRの最初のLです。トップダウン(LL)解析では、左端の派生(2番目のL)が検出され、ボトムアップ(LR)解析では、右端の派生(R)が検出されます。

事実上、両方のタイプのパーサーは単一の非終端記号(開始記号)で始まり、入力テキストが派生するま​​で、現在のシーケンスの非終端記号に基づいて派生を「推測」します。左端の派生では、展開されるのは常に左端の非終端記号です。右端の派生では、それは常に右端の非終端記号です。

したがって、トップダウンパーサーは常に、最初の非終端記号に使用するプロダクションを推測します。その後、最初の非終端記号であるものを再度処理する必要があります。 (ここでの「推測」は非公式です。一致する入力を確認できます。または、少なくとも入力の次のkトークンを確認できます。使用するプロダクションを決定するため。)これは、解析ツリーをトップダウンで構築するため、トップダウン処理と呼ばれます。

ボトムアップパーサーの動作を逆に視覚化する方が(少なくとも私にとっては)簡単です。派生チェーンの最後の派生となるプロダクションを見つけるのに十分な入力を繰り返し読み取ることにより、解析ツリーをボトムアップで構築します。したがって、それは右端の派生を生成しますが、それを後ろから前に出力します。

演算子言語のLR文法(大まかに言えば、算術式のように見える言語の文法)では、左および右の結合性は、それぞれ左および右の再帰文法規則を使用してモデル化されます。 「結合性」は、「優先順位」と同様に、文法の非公式な説明です。

優先順位は、一連の文法規則を使用してモデル化されます。各規則は次の規則を参照します(通常、括弧を処理するための再帰的な生成になります--'(' expr ')'--これは左でも右でもありません-再帰的)。

「演算子優先順位解析」と呼ばれる古いスタイルのボトムアップ構文解析があり、優先順位は明示的に言語記述の一部です。一般的な演算子優先アルゴリズムの1つは、いわゆる操車場アルゴリズムです。ただし、バイソンのようなLALR(1)パーサジェネレータを使用している場合は、より一般的で正確であるため、代わりにそれを使用することをお勧めします。

9
rici

(私はパーサーとコンパイラー理論の専門家ではありません。たまたま関連することを学んでいます。そして、これまでに見つけたものを共有したいと思います。)

これを見てみることを強くお勧めします 素晴らしい記事

それは説明し、illustrats LLおよびLRアルゴリズムです。 LLがトップダウンと呼ばれ、LRがボトムアップと呼ばれる理由がはっきりとわかります。

いくつかの引用:

LLパーサーとLRパーサーの動作の主な違いは、LLパーサーが解析ツリーのプレオーダートラバーサルを出力し、LRパーサーがポストオーダートラバーサルを出力することです。

.。

LLパーサーとLRパーサーがどのように動作するかについての非常に単純なモデルに収束しています。どちらも入力トークンのストリームを読み取り、同じトークンストリームを出力し、適切な場所にルールを挿入して、解析ツリーのプレオーダー(LL)またはポストオーダー(LR)トラバーサルを実現します。

.。

LL(1)、LR(0)などの指定が表示されている場合、括弧内の数字は先読みのトークンの数です。

そして頭字語に関して:( ソース

最初の[〜#〜] l [〜#〜] in[〜#〜] lr [〜#〜 ]および[〜#〜] ll [〜#〜]は、パーサーがの入力テキストを読み取ることを意味します。バックアップなしの一方向;その方向は通常、各行内で左から右に、完全な入力ファイルの行全体で上から下になります。

残りの[〜#〜] r [〜#〜]および[〜#〜] l [〜#〜]は、それぞれ右端と左端の派生を意味します。

これらは2つの異なる解析戦略です。解析戦略は、書き換える次の非終端記号を決定します。 ( ソース

  • 左端の派生の場合、それは常に左端の非終端記号です。
  • 右端の派生の場合、それは常に右端の非終端記号です。
1
smwikipedia