0

私は自分の DSL の推論を作成しようとしていますが、ドキュメントの助けだけでは解決できない質問がいくつかあります。

最初のもの:機能からstatic void main()を作成する必要があります: .toMethod()でstaticを追加するにはどうすればよいですか?

2 つ目: DSL に次のようなルールがあるとします。

Sequence:
    'SEQ' name=ID '{'
        statements+=Statement*
    '}'
;

Where ステートメント:

Statement:
    Sequence | others...
;

シーケンスはvoid メソッドにマップする必要があり、そのメソッドの本体はステートメントの翻訳から構成されます。しかし、問題は次のとおりです。シーケンス内で別のシーケンスを見つけると、新しいシーケンスのメソッドを作成し、スーパー シーケンスで呼び出しを追加する必要があります。

例えば:

SEQ first {
   instructions...
   SEQ second {
      other instructions....
   }
   instructions...
}

生成する必要があります:

void first(){
   instructions(translated)...
   second();
   instructions(translated)...
}
void second(){
   other instructions(translated)...
}

それを実現することは可能ですか?

4

1 に答える 1

1

最初の質問:

ctx.toMethod('main', ctx.newTypeRef(Void.Type)) [
  static = true
  ….
]

2 番目の質問:

「命令」とは「XExpression」のインスタンスを意味することを意味します。現在、推論中に新しい式を作成することはできないため、少しトリックする必要があります。基本的にできることは、シーケンスを XExpression のサブタイプにすることです。次に、JvmModelInference 中に、式ツリー (ステートメント) を調べて、シーケンスのメソッドを作成する必要があります。XbaseTypeComputer と XbaseCompiler をオーバーライドし、式の型計算とコンパイル戦略を追加する必要があります。後者は、推論中に作成されたメソッドへの呼び出しになります。

于 2013-11-29T07:19:13.823 に答える