質問

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

  1. 現在の解析コードのほとんどは正式な文法を定義していません。私は通常、自分の選択した言語で何かをハッキングします。それは簡単で、その方法を知っており、そのコードを非常に速く書くことができるからです。一緒に働く他の人たちにとっても、メンテナンスが簡単です。文法を定義して実際のパーサーを生成することの長所と短所は何ですか (たとえば、 アントラー または YACC)パーサーを作成するためにほとんどのプログラマーが使用していたハックと比較して、物事を解析するのはどうですか?
  2. C++、Perl、Ruby で文法ベースのパーサーを作成するための最適なパーサー生成ツールは何ですか?見てきました アントラー C++ ターゲットでの ANTLRv3 の使用についてはあまり見つかりませんでしたが、それ以外の点では面白そうです。ANTLR に似た他のツールで読んでおくべきものは何ですか?
  3. 解析について詳しく知りたいと考えている人にとって、正規の書籍や記事は何ですか?残念ながらコンパイラのコースは私の教育の一部ではなかったので、基本的な内容は大歓迎です。について素晴らしいことを聞きました ドラゴンブック, 、しかし他には何があるでしょうか?
役に立ちましたか?

解決

1で、私は主な利点があると言うでしょう。の保守の - ちょうど文法に対応し、小さな変更を行うことを意味、というよりも細かく様々を通じてハッキング言語に少し変更を加えますあなたは大きさの変更...受注生産性向上とバグの少ないリスク望むものとは何かを持っていることがあり、コード内のスポットます。

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

他のヒント

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

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

GoF Interpreter パターンは、「小さな言語」を作成するためのもう 1 つのテクニックです。それを見てください。

のは簡単なの書き方に関するステップバイステップのチュートリアルですのコンパイラをビルドしてみましょうコンパイラ。コードは、デルファイ(パスカル)で記述されたが、それは簡単に他のほとんどの言語に翻訳するのに十分な基本ですされます。

Haskell でのモナディックコンビネータベースの解析 (字句解析も扱うことが多い) を真剣に見てみたいと思います。私はそれが非常に目を見張るものであると感じました。この方法を使用すると、パーサーを最初から簡単に構築できるのは驚くべきことです。実際、これは非常に簡単なので、多くの場合、既存のライブラリを使用するよりも独自のパーサーを作成した方が速いです。

最も有名な例はおそらく パーセク 良いものがあるのは ユーザーガイド それはその使用方法を説明しています。このライブラリの他の言語へのポートのリストがあります ( C++ そして ルビー)に掲載されている Haskell wiki の Parsec ページ, ただし、私はこれらに詳しくないので、Haskell での Parsec の使用にどの程度近いのかは言えません。

これらが内部でどのように機能するか、また独自のパーサーを作成する方法を学びたい場合は、Graham Hutton の第 8 章 (「関数パーサー」) から始めることをお勧めします。 Haskell でのプログラミング. 。この章をよく理解したら (おそらく数回読む必要があります)、準備は完了です。

Perlで、解析:: RecDescentのモジュールが開始する最初の場所です。モジュール名にチュートリアルを追加し、Googleはあなたが始めるためのチュートリアルをたくさん見つけることができる必要があります。

BNF、EBNFまたは類似のものを使用して文法を定義する、より簡単に、後であなたがより良い時間それを維持する必要があります上にあります。また、あなたは文法定義の例をたくさん見つけることができます。あなたは、フィールド上の他の誰かにあなたの文法について話しようとしている場合は、両方同じ言語を話すされている場合は、少なくとも最後にではなく、、、それが優れている(BNF、EBNFなど。)。

、独自の解析コードを書く車輪の再発明のようなもので、エラーを起こしやすいです。また、それほど保守性です。もちろん、それはより柔軟にすることができ、小規模なプロジェクトのためにも良い選択かもしれませんが、文法を取り、コードを吐き出し、既存のパーサジェネレータを使用すると、我々のニーズのほとんどをカバーする必要があります。

は、C ++のために私はまた、LEX / yaccのをお勧めします。 Ruby用これはまともな選択肢のようになります。ココ/ R(uby)

おかしいタイミング:私はステートマシンとパーサに疑問を抱いて、私はそれらについての詳細を学ぶことができるか把握しようと、今朝の多くを過ごした。

2の場合、あなたは(これはC ++とRubyのために良いことだ) Ragel のを見てかかることがありますます。

ここで、自己完結型(10ページ!)、完全にポータブルパーサジェネレータのチュートリアルです これは非常に迅速に「低オーバーヘッド」DSLを設計し、実装するために使用することができます:

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

このサイトはMetaIIにヴァルSchorreの1964年論文を紹介します。 はい、1964年そして、それは素晴らしいです。これは私がコンパイラについて学んだ方法です バック1970インチ

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