2011-01-18 9 views
9

私はコンパイラーの世界では初めてです。パーサージェネレーターと呼ばれるものについて最近聞いたことがあります。パーサージェネレータは構文ファイルを取り込んで、与えられた構文でファイルを解析できるソースコードファイルを出力します。パーサージェネレーターとRagel ...自分のDパーサーを作る

いくつかの質問は:

  1. 私はそれを正しく理解していましたか?

  2. もしそうなら、Ragelはこのようなツールですか?

  3. もしあれば、RagelはDパーサをDソースコードに出力できますか?

ありがとうございます!

+2

」 dのコンパイラ "ようこそ。 – umlcat

答えて

18
  1. これは基本的にそれです。パーサージェネレータは、文法を、文法によって定義されたlanguageのメンバである文字列を認識するために使用できるソースファイルに変換します。多くの場合、必ずしもそうであるとは限りませんが、パーサジェネレータでは、字句解析ツールを使用する前にテキストをトークンに分解する必要があります。 Lex and Yaccは、対の字句アナライザとパーサジェネレータの古典的な例です。

    最新のパーサジェネレータは、追加の機能を提供します。例えば、ANTLRは、字句解析、文法解析のためのコードを生成し、生成された抽象構文木を歩くことさえできます。 Elkhoundは、構文解析アルゴリズムGLRを使用するパーサーを生成します。これにより、一般化されていない解析アルゴリズムよりも広い範囲の言語を認識することができます。 PEG Parsersでは、別の字句解析ツールは必要ありません。

  2. 実際に、有限状態機械の形で字句解析器を生成します。 regular languageは認識できますが、context-free言語は認識できません。これは、Dを含むほとんどのプログラミング言語を認識できないことを意味します。

  3. 高速レキシカルアナライザーが必要な場合、RagelはDコードを生成します。

パーザージェネレーターがあなたのために何をしているかを完全に理解するには、公式な言語と構文解析理論が必要です。 The Dragon Bookよりも開始する場所が悪いです。参照:Learning to write a compiler

勇気がある人は、DMDコンパイラ -/dmd2/src/dmd/- lexer.cとparse.cで配布されているレキシングと解析のコードを確認してください。

11

Ragelは正規表現に基づいていますが、ではなく、正規表現FSMジェネレータです。それは、追加の呼び出し/戻り構文、および非正規言語の解析を可能にする他の機能を使用して再帰を可能にします。したがって、RagelはFSMを生成しますが、複数の異なるFSMを生成することができ、任意の時点でそれらの間をジャンプするためのメカニズムを提供するか、特殊なマシン遷移構文を使用します。また、状態遷移時に任意のコードを実行することもできます。

Ragelをユニークにするもう1つの点は、オンラインであることです。つまり、非ブロッキングソケットなどの非同期ソースからデータをスキャンするのは簡単です。コール/リターンのためにスタックに静的、自動、また​​は動的メモリを使用できる点を除いて、動的リソースも使用しません。しかし、あなたが欲しい。グローバルな状態もありません。

Ragelは非常にユニークです。ほとんどの(すべて?)伝統的な発電機とは異なり、それはネットワークプログラミングのために作られたものです。

1

は次のようになります。

MySourceCode - >(スキャナ) - > MyScannerDataFile MyScannerDataFile - >(パーサ) - > MyParserDataFile MyParserDataFile - >(CodeGenerator) - > MyExecutableFile

または:

MySourceCode - >(ScannerAndParser) - > MyScannerAndParserDataFile MyScannerAndParserDataFile - >(CodeGenerator) - ワールに新しい> MyExecutableFile