2

私はコンパイラー (C に近い言語) に取り組んでおり、それを C で実装する必要があります。私の主な質問は、コンパイラーのコーディング中に効率的にするために、適切な解析方法を選択する方法です。

これが私の現在の文法です: http://img11.hostingpics.net/pics/273965Captureddcran20130417192526.png

ここで説明されているように、トップダウン パーサー LL(1) を作成することを考えていました: http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/07-Top-Down-Parsing.pdf

この文法を考えると、最初に左の再帰規則を削除する必要があることを知っていると、効率的な選択になるでしょうか。他にアドバイスはありますか?

ありがとう、メンティネット

4

4 に答える 4

2

パーサーを構築する最も効率的な方法は、パーサーを構築することを目的とする特定のツールを使用することです。以前はコンパイラ コンパイラと呼ばれていましたが、現在では、独自の言語を構築するためのより多くの支援を提供する言語ワークベンチに焦点が移っています (広くなっています) 。たとえば、ほぼすべての言語ワークベンチは、文法を見るだけですぐに IDE サポートと言語の構文強調表示を提供します。また、文法や言語のデバッグにも非常に役立ちます (左再帰が最大の問題になるとは予想していませんでしたよね?)。

現在サポートされている、開発中の言語ワークベンチのうち、最も優れているものは次のとおりです。

あなたが本当にそう思うなら、または娯楽と経験のためだけにパーサーを自分で書くことを考えているなら、最高の最新のアルゴリズムはSGLRGLL、およびPackratです。それらのそれぞれは、半世紀にわたって続いたアルゴリズム研究の真髄であるため、それらを一瞬で完全に理解できるとは期待しないでください。と。ただし、素晴らしい改善を思いついた場合は、その発見を著者と共有するか、別の方法で公開することを躊躇しないでください!

于 2013-04-19T08:24:53.527 に答える
1

すべてのアドバイスに感謝しますが、最終的には、こことまったく同じ方法を使用して、独自の再帰降下パーサーを作成することにしました: http://www.cs.binghamton.edu/~zdu/parsdemo/recintro.html

実際、左再帰規則を削除するために文法を変更しました。最初のメッセージで示した文法は LL(1) ではないため、トークン リスト (スキャナーで作成) を使用して先読みを進めました。さらに遠く。それはかなりうまく機能しているようです。

これで、これらの再帰関数内で AST を構築できました。何か提案はありますか?チップ?どうもありがとうございました。

于 2013-04-25T07:41:49.373 に答える