8

手書きの再帰降下パーサー (必然的に LL(k)) は、生成された LALR パーサーとパフォーマンスの点でどのように比較されますか?

LALR パーサーは LL(k) よりもはるかに多くの文法を処理できることを知っています。ただし、パーサーを手動で作成することが私の意図であり、再帰降下が最も適切な選択のようです。他の種類のものを手で (合理的に読みやすく) 興味を持って書くことは可能ですか?

注意: 私はテールコール最適化 (F#) を備えた関数型言語を使用しているため、[適切に調整された] 再帰は他の言語ほど問題になりません。

4

2 に答える 2

9

解析しようとしている言語に大きく依存すると思います。時々忘れられるパフォーマンスの別の部分は、字句解析 (スキャン) 部分です。これは、記号ではなく文字を処理するため、パフォーマンスにとって重要です。再帰的降下は、パーサーを作成する最初のイテレーションとして適切であり、解析された言語のロジックに従うことが非常に自然になります。解析された言語が適合する場合 (左再帰がない場合) は、再帰的降下から始めるべきだと思います。この段階でパフォーマンスのために LALR を選択するのは時期尚早の最適化のようです。手動でチャート パーサーを作成することはできますが、これがあなたの意図するものであるとは思えません。手動で LALR パーサーを作成することは可能ですが、面倒です。

于 2009-01-28T16:14:58.827 に答える
3

この時点で、パフォーマンス上の理由からLALR と LL のどちらかを決定するのは時期尚早の最適化のように思えます。解析時間がコンパイラのボトルネックになることはめったにありません。私があなただったら、文法をボトムアップとトップダウンのどちらで定義するのがより快適であるかに基づいて選択します。

個人的には、LALR 文法は扱いやすく、F# の fsyacc 統合 (私が構文解析を学んだ方法) により、yacc をプロジェクトに統合するのが非常に簡単になります。

于 2009-03-27T15:33:27.837 に答える