6

私はプログラムでいくつかの簡単な変換を実行するツール(extractメソッドなど)に取り組んでいます。これを行うには、コンパイルの最初のいくつかのステップ(トークン化、解析、場合によってはシンボルテーブルの作成)を実行する必要があります。Cから始めて、うまくいけば、これを拡張して複数の言語をサポートします。

私の質問は、これらの手順を実行するための最良の方法は何ですか?

1.)車輪の再発明はしません。明らかに、Flex/Bisonの仕様を手作業で書きたくありません。既存の仕様を取得してそこから作業するだけですか?Antlrはここに行く方法ですか?

2.)複数の言語に拡張可能です。もちろん、字句解析/構文解析は人によって異なりますが、他の言語に簡単に拡張できるソリューションが必要です。少なくとも、これを管理しやすくする一連のテクノロジー。

ところで、私はアプリケーションを書くためにCを使用しています

誰かが素晴らしいアイデアを持っているなら!ありがとう!

4

5 に答える 5

7

構文解析を行うための最良の方法はANTLRです。必需品である著者による主題に関する2つの素晴らしい本があります。決定的なANTLRリファレンス:ドメイン固有言語の構築と言語実装パターンは、どちらも貴重なリソースです。ANTLRは、さまざまな言語で処理コードを生成できます。

于 2010-02-12T15:31:06.227 に答える
4

すでに書かれた文法と正規表現を使用するので、ツールの選択は影響力があります。

あなたはフレックス/バイソンで行くことができます、そしてあなたはすでに書かれた多くの文法を見つけるでしょう。それ以外の場合は、C、C ++、およびJavaで問題なく動作するはずのANTLRを使用して、同じことを実行できます。

あなたはこの仕事にどの言語を使うつもりかについて話さなかったので、より良いアプローチを提案することはそれほど簡単ではありません。

すべての言語には独自の機能があるという事実を考えてみてください。たとえば、シンボルテーブルはC++とは異なる方法でRubyで作成されます。これは、宣言を厳密にしたり緩めたりすることができるためです。したがって、必要なものをよく考える必要があります(質問でも説明できるので、より適切なサポートを提供できます)。

あなたの2つのフェーズのうち、私はそれを言うことができます

  • トークン化は非常に単純で、言語ごとに異なる構造を必要とせず、多数のプログラミング言語をサポートするように簡単に拡張できます。

  • 解析はより困難になる可能性があります。プログラムの抽象構文木を構築してから、好きなことをする必要があります。OOPスタイルを使用する場合は、ノードタイプごとにクラスを使用する必要がありますが、ノードタイプは構造が異なるため言語間で変わる可能性があるため、一般的で他の言語に簡単に拡張できるようにするのは非常に難しいです。

この点で、ANTLRはASTの自動生成を提供するため、FlexとBisonに勝ちます(私がよく覚えている場合)。

これら2つのコンパイラのコンパイラの主な違いは、ANTLRがLL(k)パーサー(トップダウン)を使用するのに対し、BisonはボトムアップのLALR(1)を使用するという事実ですが、すでに記述されている文法を使用する場合は、そんなに難しいことではありません。

個人的なアドバイス:私は多くの通訳者やコンパイラーを書きましたが、完全な機能を備えた言語から始めたことはありません。C構文は非常に大きいので、サブセットから始めて、トークンとASTで何ができるかを確認し、後で完全な構文をサポートするように拡張する必要があります。

于 2010-02-12T15:33:37.813 に答える
2

プログラムはどの言語で書いていますか?

私はantlrを使用します(実際にはJavaの解析に使用します)。多くの言語をサポートし、無料で入手できる多くの例の文法もありますhttp://www.antlr.org/grammar/list。残念ながら、それらは完全である必要はありません(Java文法にはASTルールがありません)が、良いスタートを切ることができ、パーサジェネレーターとしてはコミュニティがかなり大きいと思います。

多くの言語ターゲットとは別に、antlrの優れている点は、antlrでサポートされている述語と組み合わせたLL(*)が非常に強力で、理解しやすく、生成されたパーサーも強力であることです。

「複数の言語に拡張可能」とは、複数のソース言語を意味していると思います。これは簡単なことではありませんが、できるだけ多くの共通記号を持つASTに変換し、それらの言語の違いを処理できる一般的なツリーウォーカーを作成すると、ある程度の成功を収めることができると思います。しかし、これは非常に難しいかもしれません。

ただし、オンラインドキュメントは、公式のantlrブックを読み、LL(*)と意味および構文の述語を理解した後でのみ有効であることに注意してください。

于 2010-02-12T15:40:40.077 に答える
1

言語を指定しなかったので、先日見つけたこの小さな宝石をお勧めします。

http://irony.codeplex.com/

使い方はとても簡単で、いくつかの言語用に事前に構築された文法もあります(C#でも)。Pythonをソース言語として使用したい場合は、pyparsing(http://pyparsing.wikispaces.com/ )もあります。

于 2010-02-12T15:25:57.210 に答える
-2

通過するドアはEclipseです。さまざまな言語に対して、エラー耐性のある構文解析を含む構文解析があります。Eclipseには、IDEに触れることなくこの機能を利用できるようにする内部モジュール性があります。

于 2010-02-12T15:31:30.183 に答える