Parsetreeを修正できる方法はありますか?トークンストリームが付随していますか?

StackOverflow https://stackoverflow.com//questions/23022079

質問

私の質問は言語実装の質問とAntLR4 APIの質問の両方です。 はParsetreeを修正することができ、トークンストリームを伴うことができますか?

これはシナリオです。データフロープログラムを定義する簡単な言語があります。あなたは興味があるなら、 github にそれを見ることができます。私はLEXとANTLR4で言語を解析します。リスナーを使用して解析ツリーを歩き、コードを評価します。

最近実行した問題は、実行時にコードを変更できる必要があります。新しいオブジェクトを定義し、それらからインスタンスを作成できるようにする必要があります。注意、私は言語で反射を持つことを指していません。 IDEのようなプログラムがソースコードの内部表現を変更するようなプログラムを持っていることを参照しています。

私はASTを作成するための定義オブジェクトの束を定義するための道を停止しましたが、私はこのアプローチが私がASTを歩くための私自身のソリューションを思い付くために私が必要とすることに気づくでしょう。ホイールを再発明するのではなく、AntLRのリスナー/訪問者を使用するのはむしろです。

もう1つの問題点は、ASTを任意の時点で任意の時点でコードとしてASTを出力できるようにする必要があります(保存できるように言語を埋め込むためのツール。)私はStringTemplateを使っています自分の定義オブジェクトからコードを生成します。私はSTを解析の木を作ることができるべきだと思います。

一般に、私はランタイム内からコードをLEX、解析、評価、リファクタリング、評価し、および生成することができる必要があります。

私自身の定義オブジェクトを作成するのではなく、最良のアプローチがどのようなアプローチがどのようなものであるか疑問に思っていますか?

役に立ちましたか?

解決

あなたの言語をチェックしました。それはかなり簡単に見えます、そしてそれはそれがあると仮定しています。

あなたの説明から、IDEがツリー上で直接動作することに基づいています。これがあなたが必要とするようにあなたが必要とすることを考える:

  1. あなたの言語のパーサー、ソースコードをツリーに変換します。 AntLRはこれを行うことができますが、提供されているものに頼るのではなく、あなた自身の木を建てる必要があるかもしれません。あなた自身のパーサを書くことはそれほど難しいことではありません。
  2. 木の書き換えルールそれが有効なままであることを保証するツリーの一連の許可された変換。これは、ツリー上で動作するAPIの形式である可能性があります。この http://www.program-transformation.org/transform/trealwriting は役に立ちます。
  3. ソースコードの生成ツリーからソースコードを再構築する機能。コメントやフォーマットを保存する必要がある場合は(a)のどちらか(b)を参照して、作成されたコードを使用して生成されたソースコードをマージします。
  4. 最終結果は、ソースコードまたは生成ツリーのいずれかの変更を往復することができます。 これが多くの仕事であると思うならば、それはです。しかし、これらの施設を提供することを目的とした他の多くのツールの基礎です。節約猶予はあなたの言語が単純であるということです。

他のヒント

現時点では、解析木を安全に変える手段はありません。古いバージョンを派生させるのが最善です。また、トークンストリームの書き換えエンジンのThingieを見る必要があります。 ter

あなたの質問に対する短い答えは、はいですが、あなたが推測するにつれて、それは痛みを伴う壊れやすいでしょう。

はるかに作業可能な代替手段は、ソースコード/解析ツリーの「内部」表現を変更するために明示的な要件を明確にしない限り、単に(事実上)キーストローク間の変更されたソースコードを単に再解析することです。アクティブなエディタの現在の内容を文字列としてつかみ、それをLexerへのストリームとしてフィードします。

高価な操作のように聞こえるかもしれませんが、AntLRは実際にはかなり速いです。特にEclipseはこのアプローチでうまく機能します - 私はエディタのパフォーマンスに顕著な影響を与えずに多くのDSLエディタでそれを使用しました。解析は完全にバックグラウンドスレッド上に発生します。編集者の問題マークは、前景編集スレッドに十分な一時停止がある場合にのみ更新されます。NetBeansは似ているはずです。

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