23

私は最近、この優れた記事から Pratt パーサーについて学び、Pratt パーサーが再帰降下パーサーよりもはるかに単純でエレガントであることを発見しました。それらが他のパーサー タイプとどのように比較されるかについてもう少し情報を見つけようとしましたが、ウィキペディアの記事はかろうじてスタブであり、それを使用するより大きなプロジェクトの数は 2 に等しいことがわかりました。

Pratt パーサーがほとんど使用されないのはなぜですか? 私が知らない深刻な制限や欠点はありますか? 他の種類のパーサーと比較して、どの程度正確ですか? いつ使用すべきか、いつ使用すべきでないか?

4

1 に答える 1

21

プラットパーサーといわゆる「操車場」パーサー(はるかに長いウィキペディアの記事が添付されています)の間にほとんど違いはありません。主な違いは、Prattが再帰を使用するためスタックを使用するのに対し、Djikstra(「操車場」)は明示的なスタックを保持することです。それ以外は、まったく同じ一連の操作を実行します。Djikstraのアルゴリズムの表現は、再帰恐怖症のためにより一般的であると思います。

プログラムスタックを使用することにはいくつかの利点があります。そのうちの1つは、スタック全体が1つの型である必要がないため、型の安全性を維持しやすいことです。一方、多くの式パーサーには1つのタイプしかありません。

Dragon Bookには、文法から演算子の優先順位表を生成するアルゴリズムが含まれています。指摘しているように、アルゴリズムが成功するという事実は、必ずしも演算子の優先順位パーサーがまったく同じ言語を解析することを意味するわけではありません。確かに忘れてしまった興味深い情報がそこにあります。あなたがアルゴリズムに興味があるなら、それはあなたが見ることができる場所の1つです。これには、生成の結果を明白な方法で<と>で囲む場合、派生を調べることによって<と>の優先関係演算子を生成できるという興味深い洞察が含まれています。

全体として、私の経験では、ほとんどの場合、「私の神様、私はXに出くわしたばかりですが、それは素晴らしいことです。なぜもっと多くの人がそれを知らないのですか????」というブログ投稿を見つけたときです。答えは「あなたの無知が普遍的であると思い込まないでください」です。しかし、多分私は今日ちょうど冷笑的な気分になっています。

ちなみに、Luaパーサーは、Prattスタイルの構文解析を使用して式を解析する手作りの再帰下降パーサーです。これはかなり一般的な手法だと思います。パターンを確認するにはコードを調べなければならないかもしれませんが、おそらく他の場所でも見つかるでしょう。

于 2012-11-30T01:33:49.250 に答える