2016-07-23 5 views
1

これはANTLR対BISONではなく、金属質問への手でコード化されたペダルです。
また、バイナリ形式の解析用です。字句解析はありません。LL(1)パーサーはプレフィックスのエンコーディングで効率的ですが、LR(1)はより効率的です。

+0

ようこそスタックオーバーフロー!私はあなたの問題を推測できる限りあなたの質問を編集しました。しかし、多くの人々がそれを見ることができるように、より多くの説明を追加してください。 P Good Luck! – manetsus

+0

バイナリ形式の場合でも、トークンを特定する必要があります(たとえば、プロトコルに応じて、入力ストリームから4バイト整数をリトルエンディアンまたはビッグエンディアンのバイト順に抽出する必要があります)。字句解析の道徳的な同等物です。そして、ほとんどの場合、トークンを構文形式に関連づける比較的簡単なコスト(「解析」)よりも多くのサイクルを要します。 – rici

答えて

1

厳密なプレ(またはポスト)順序式を解析するコストは、トップダウン技術またはボトムアップ技術のいずれかを使用して簡単です。それは、他のタスクのいずれか、つまり字句解析でさえも矮小になります。小さなスピードの違いは、アルゴリズムの戦略ではなく実装の詳細の結果になります。

LR(1)パーサーを使用することには意味がありません。プリオーダーまたはポストオーダーの表現ではトークンルックアヘッドは必要ありません。 LR(0)はうまくいくでしょう。便利なLR(0)パーザージェネレーターを見つけることはまずありませんが、実際にパーザーを手書きして作業を単純化する場合は、

0

現在、LL(1)とLR(1)を無視して、通常は独自の解析コードをローリングしてこれらの種類の解析を解析します。以前に解析され、評価された部分式のスタックを維持し、スタックから上位2つのアイテムをポップし、それらをマージするか(別の演算子を読んだ場合)、何かをスタックにプッシュします。

実際にそのスタックを実装する方法はいくつかあります。スタックを明示的なスタックデータ構造にすることができます。左から右に入力をスキャンし、必要に応じてプッシュしてポップします。これは、LR(1)パーサがどのように動作するかにスタイルに最も近いものです。なぜなら、シフト(pushing)と縮小(popping)の観点から考えているからです。代わりに、再帰的アルゴリズムを使用して、呼び出しスタックを明示的スタックの代わりにすることができます。これは、LL(1)解析がどのように機能するかに精通しています。

この場合、LL(1)とLR(1)の両方を解析すると、生のパフォーマンスを気にするだけで、過剰なオーバーキルのように見えます。彼らは、大量の一般的な文法を扱うように設計されており、テーブルからのオーバーヘッドがあなたのパフォーマンスに悪影響を与える可能性があります。私はちょうど2つの異なる方法(明示的なスタック/ボトムアップ対暗黙のスタック/トップダウン)でコードを書いて、2つのうちどれが実際より速く終わるかを見てみよう。

+0

ありがとうございます。これは、パーズレイテンシが重要な金属のペダルです。私の直感によれば、LLはプレフィックスの方が良く、LRは後置式の方が良いという。しかし、あなたが示唆するように、私は両方を書いてテストします。実際には、LL /プレ、LL /ポスト、LR /プレ、LR /ポスト、テストの4つのケースすべてをテストするでしょう。 – Olsonist

+0

実際には、コールスタックは最新のx86で明示的なHWサポートを持っています。それは、私が考えていなかったテーブルを再帰的にまともなものにする利点になります。 – Olsonist

0

この記事で、LL and LR Parsing Demystified、私の直感をバックアップします:

ポーランドと直接逆ポーランド記法はそれぞれ、LLとLRの解析に、私の見解では、対応しています。

関連する問題