質問

再帰的アセントパーサーはどのように機能しますか?再帰を書きました 降下 私自身パーサーは理解していますが、LR パーサーについてはあまりよく理解していません。私が ウィキペディアで見つかりました 私の混乱はさらに大きくなっただけです。

もう 1 つの疑問は、なぜ再帰的アセント パーサーがテーブルベースのパーサーよりも使用されないのかということです。再帰的上昇パーサーの方が全体的にパフォーマンスが優れているようです。

役に立ちましたか?

解決

clasical rel="nofollow noreferrer">ドラゴンブック。 解析手法もあります。実用ガイド。あなたがそれらについて読むことができる場所私はよく覚えている場合、に。ウィキペディアでの記事(少なくとも、導入は)右ではありません。彼らはあなたがスペイン語を理解する場合は、書籍の完全なリスト<のhref = "https://stackoverflow.com/questions/1669/があるドナルド・クヌースによって作成された、と彼は彼のザ・アートコンピュータのプログラミングボリューム5でそれらを説明しました。ここを私が投稿学習・ツー・ライト・コンパイラ/ 789357#789357" >。いないすべての書籍はどちらか、スペイン語であること。

彼らはどのように機能するかを理解するために、あなたが最初のようないくつかの概念を理解する必要があります前に、

、次のと先読み。また、私は本当にLR(アセンダント)パーサを理解しようとする前に、LL(子孫)パーサの背後にある概念を理解することをお勧めいたします。

Kは、彼らが作業する必要がありますどのように多くの先読みでパーサLRの家族、特別にLR(K)、SLR(K)とLALR(K)が、あります。 yaccはLALR(1)パーサをサポートしていますが、それは文法のより強力な種類で動作させるために、ベースの微調整ではなく、理論を作ることができます。

のパフォーマンスについて、それが分析されている文法に依存します。彼らは、線形時間で実行しますが、どのように多くのスペース、彼らに必要なのは、あなたが最後のパーサの構築んどのように多くの州によって異なります。

他のヒント

私は個人的には、関数呼び出しを速くすることができますどのように理解するのに苦労を抱えている - テーブルルックアップよりも「かなり速い」はるかに少ないです。そして、私も「かなり速い」レクサー/パーサは(主に読み込み、ファイルをトークン化)を行う必要があることを他のすべてと比較すると微々たるものであると思われます。私は、ウィキペディアのページを見ますが、参照していませんでした。著者は、実際には、完全な字句解析/パーサをプロファイリングしましたか?

私にはもっと面白い再帰下降に関しては、テーブル駆動型のパーサの減少です。私はYACC(または同等の)選択肢のパーサジェネレータだっCの背景から来ます。私は、Javaに移動したとき、私は1つのテーブル駆動型の実装(JavaCup)を発見し、いくつかの再帰下降実装(JavaCCの、ANTLR)。

私の答えは、「なぜJavaの代わりにC」の答えに似ていると思われる:実行速度は、開発のスピードと同じくらい重要ではありません。 Wikipediaの記事で述べたように、テーブル駆動型のパーサは、コードから理解することはほとんど不可能です(バック私はそれらを使用していたとき、私は彼らの行動をたどることができますが、パーサーから文法を再構築することができたことはなかっただろう)。再帰下降は、比較することによって、(それはいくつかの20年でテーブル駆動に先行する理由は間違いないです)非常に直感的です。

再帰に関するウィキペディアの記事 上昇 解析では、このトピックに関する元の論文と思われるもの (「Very Fast LR Parsing」) を参照しています。その紙をざっと読んだことで、いくつかのことが明らかになりました。気づいたこと:

  1. この文書では、アセンブリ コードの生成について説明します。代わりに C または Java コードを生成している場合に、同じことができるかどうか疑問に思います。セクション 4 と 5、「エラー回復」および「スタック オーバーフロー チェック」を参照してください。(私は彼らのテクニックを否定しようとしているわけではありません。うまくいくかもしれません。ただ、コミットする前に調べたほうがいいかもしれないと言っているだけです。)

  2. 彼らは、再帰的上昇ツールを独自のテーブル駆動パーサーと比較しています。結果セクションの説明から、テーブル駆動パーサーは「完全に解釈」されているようです。カスタムで生成されたコードは必要ありません。全体的な構造は依然としてテーブル駆動でありながら、処理を高速化するために特定のアクションに対してカスタム コードを生成するという中間点はあるのだろうか。

ウィキペディアのページで参照されている論文:

テーブル解釈の代わりにコード生成を使用することに関する別の論文:

また、再帰降下解析は、LL 文法ベースの言語を解析する最速の方法ではないことに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top