9

私は1999年から仕事と楽しみのためにプログラミングをしています。私は新しいことを学びたいと思っています。私の仕事の大部分はデータの読み取り、統合、分析であるため、最近は構文解析に重点を置いています。また、オーバーヘッドが十分に低ければ、非常に単純なドメイン固有言語で表現できると思う反復的なタスクが多数あります。この件についていくつか質問があります。

  1. 私の現在の構文解析コードのほとんどは、形式文法を定義していません。私は通常、選択した言語で何かを一緒にハックします。それは簡単で、その方法を知っていて、そのコードを非常に高速に記述できるからです。一緒に仕事をしている他の人にとっても、メンテナンスは簡単です。ほとんどのプログラマーがパーサーを作成するために使用したハックと比較して、文法を定義し、実際のパーサーを生成して( ANTLRまたはYACCで行うように)物事を解析することの長所と短所は何ですか?
  2. C ++、Perl、Rubyで文法ベースのパーサーを作成するための最良のパーサー生成ツールは何ですか?私はANTLRを調べましたが、C ++ターゲットでANTLRv3を使用することについてはあまりわかりませんでしたが、それ以外の点では面白そうです。私が読むべきANTLRに似ている他のツールは何ですか?
  3. 誰かが構文解析についてもっと学びたいと思っている標準的な本や記事は何ですか?残念ながら、コンパイラのコースは私の教育の一部ではなかったので、基本的な資料は大歓迎です。ドラゴンブックについて素晴らしいことを聞いたことがありますが、他に何がありますか?
4

8 に答える 8

4

あなたの(非常に良い)質問に対する私の見解は次のとおりです。

  1. パーサーは、文法が実際に存在する重要な状況から最も恩恵を受けると思います。その手法を考えるには、パーサーと文法がどのように機能するかを知る必要がありますが、すべての開発者が知っているわけではありません。
  2. lex/yacc は古い Unix ツールで、C++ 開発者が使用できる可能性があります。たぶんバイソンも。
  3. ANTRLとそれに付随する本はとても良いです。 「コンパイラーとインタープリターの作成」には、C++ の例が含まれています。

GoF インタープリター パターンは、「小さな言語」を作成するためのもう 1 つの手法です。それを見てください。

于 2009-06-27T20:43:13.990 に答える
4

1. については、主な利点は保守性だと思います。言語に少し変更を加えるということは、コードのさまざまな箇所を細かくハッキングするのではなく、それに応じて文法に小さな変更を加えることを意味します。変更したいもので...生産性が桁違いに向上し、バグのリスクが小さくなります。

2. と 3. については、あなたがすでに見つけた以上のものを提案することはできません (私は主に Python と を使用しておりpyparsing、多くの Python 中心の解析フレームワークでの経験からコメントできますが、C++ の場合はほとんど古き良きものを使用します。節くれだった私の古いドラゴンブックのコピー -- 実際には最新版ではありません -- が目的のために手元に置いているすべてです...)。yaccbison

于 2009-06-27T20:43:15.223 に答える
2

Let's Build A Compilerは、簡単なコンパイラを作成する方法についての段階的なチュートリアルです。コードは Delphi (Pascal) で書かれていますが、他のほとんどの言語に簡単に翻訳できるほど基本的なものです。

于 2009-06-27T20:38:51.097 に答える
1

BNF、EBNF、または同様のものを使用して文法を定義する方が簡単で、後でそれを維持するのに時間がかかります。また、文法定義の多くの例を見つけることができます。最後に大事なことを言い忘れましたが、自分の文法についてフィールドで他の誰かに話す場合は、両方とも同じ言語 (BNF、EBNF など) を話している方がよいでしょう。

独自の解析コードを記述することは、車輪を再発明するようなものであり、エラーが発生しやすくなります。また、保守性も低くなります。もちろん、それはより柔軟になる可能性があり、小さなプロジェクトの場合は良い選択かもしれませんが、文法を取得してコードを吐き出す既存のパーサー ジェネレーターを使用することで、ほとんどのニーズをカバーできるはずです。

C++ の場合、lex/yacc もお勧めします。Ruby の場合、これは適切な選択のように見えます: Coco/R(uby)

于 2009-06-27T20:51:33.007 に答える
1

これは自己完結型 (10 ページ!) で、「低オーバーヘッド」DSL を非常に迅速に設計および実装するために使用できる、完全に移植可能なコンパイラー コンパイラーに関するチュートリアルです。

http://www.bayfronttechnologies.com/mc_tutorial.html

このサイトでは、MetaII に関する Val Schorre の 1964 年の論文を紹介しています。はい、1964年です。そして、それは驚くべきことです。これが、1970 年に私がコンパイラについて学んだ方法です。

于 2009-07-17T09:22:41.230 に答える
1

面白いタイミング: 私は今朝、ステート マシンとパーサーについて疑問に思い、どうすればそれらについて詳しく学べるかを考えることに多くの時間を費やしました。

2 については、 Ragelを検討してください(C++ と Ruby に適しています)。

于 2009-06-27T21:08:20.460 に答える
1

perl では、Parse::RecDescent モジュールが最初に開始されます。モジュール名にチュートリアルを追加すると、Google は開始するための多くのチュートリアルを見つけることができるはずです。

于 2009-06-27T20:42:55.257 に答える