2012-01-15 24 views
9

質問:ゼファーASDL(抽象構文記述言語)

ゼファーASDLは何か、どのようにレクサーとパーサジェネレータのような他のコンパイラ技術に関連していますか?

(私があなたが合理的に完成していればそれは感謝しますが、技術的になるとオンラインで他の参考文献を指します。なぜなら私はコンパイラについて知っていることのほとんどがyaccとflexで遊んでいるからです。 C、および検索し、オンラインのものを読んで)

質問の背景:

私はhttp://docs.python.org/devguide/compiler.htmlを読んでいると、私は次の行に出くわした:

ASTノードの仕様は、Zephyr 抽象構文定義言語(ASDL)を使用して指定します。

私は見つけることが一番下に引用を追っ: http://www.cs.princeton.edu/research/techreps/TR-554-97

私が最初に読んだ記事はかなり騒がしいものでしたが、ASDLの目的がコンパイルプロセスのコンテキストであったかどうかをより深く理解してから、やり直すことを期待していました。

答えて

5

レクサーとパーサージェネレータは、レクエムと文法の記述を受け入れ、対応するアーティファクトを実装するコードを生成します。 Lexは、トークンを記述するために通常の表現を必要とします。パーサジェネレータは、さまざまな種類の拡張BNF表記を使用します。

あなたが参照している論文はかなり明確です.IMHO:ASDLは、ツリーノード(そのタイプと署名)の集合を抽象的に記述するための小さな言語です。この言語を使用すると、パーサーで使用するツリーを実装するために必要なレコードタイプのセットに、これらの記述を変換するツールを書くことができます(そして、その作者はそうしました)。したがって、ADSLは、RegexesやBNFのようなものです。その目的は、コンパイラの一部を生成するコードジェネレータに供給されることです。

コンパイラは非常によく理解されている技術であり、さまざまな部分の記述からそれらを生成できるはずです。 Regex/BNF/ADSLは、解析段階の重要な鍵です。

あなたは理想的には、抽象ツリーからターゲット命令セットまでのターゲット命令セット、フロー解析、翻訳(最大のマッチを述べた)、最適化を記述する方法の記述言語が好きです。その後、それぞれのツールに対応するツールを使用して、「仕様」からコンパイラ全体を構築できます。実際には がこのエリアで多くの仕事をしています。人々はこれらのすべてを別々に一緒に行ってきました。当然のことながら、以前はPrincetonから出た "Zephyr"プロジェクト(ZephyrのWebサイトは現在死んでいるようです)から来ています。その目標はこのようなことだけでした。

とにかくGoogle Scholarの "コンパイラジェネレータ"を探してみてください。

0

モジュールでツリーを生成し、他のモジュールに同じツリーを入力する必要がある場合(またはほとんど同じツリー、何らかの形で最適化されている場合)にASDLが使用されます。

これを行うには、構造の機能(理想的にはタイプチェッカー)、ツリーを印刷して、正しく生成したことを視覚化する機能が必要です。

ASDLは、代数的データ型(haskellやmlなど)の構文やBNFの構文とほぼ同じ構文で書かれたツリーを入力として受け取りますが、はるかに単純化され、すべてのコンストラクタを自動生成します。ツリーの簡単な説明から始まる関数です。

たとえば、レクサーがある場合、タイプを持つレクエムを生成する必要があります。また、語彙の出力ストリームを見る必要があります(これは線形なので、非常に単純なツリーです)。代わりに、語彙素を構築する、印刷するための関数を書いて、あなたは彼らにその

lexeme= 
     ID(STRING) 
    | INT(num_integer) 
    | FLOAT(num_float) 
    attributes(int coord_x, int coord_y) 
    num_integer: 
    .... 
    num_float: 
    .... 

のようなものを定義し、あなたのレクサーからコンストラクタID、INT、FLOAT、などを呼び出します。 ASDLは、必要なすべての関数でこの単純な構文を変換し、ASTのノードを作成したり、必要なものを印刷したりします。 ASDLは生成されたコードに制限を課しません。

トークンの座標などの型にattributesを追加すると、そのような属性がその型の各コンストラクタのパラメータに追加されます。パーサによって作成された

Aより複雑なツリーは、パーサによって作られたSUM(_ _)の呼び出しがで作成したノードを合計する合格することを確認します。この場合のASDLはその

expr: SUM(expr, expr) 
     |PRODUCT(expr, expr) 
     |number 
number: num_integer 

ようになります。 exprのコンストラクタの1つ。 num_integerは外部で定義されています。おそらく、レクサーのasdlツリーによって定義されています。

number: [0-9]+などの正規表現を含むコンストラクタを定義することはできません。 ASDLはEBNFより簡単です。

これらのコンストラクタは、必要なものをビルドするために、チェックを入力して、lexer/parser/codeジェネレータがasdlで定義された言語に適合するツリーを出力するように定義されます。

ASDLについてよく理解するには、3-4パーサーを作成し、生成するコードに共通するものを確認する必要があります。その共通部分は実際はASDLなので、これは特にパーサーの出力のための抽象です。

関連する問題