1

Xbase 文法の一部を使用する Xtext プロジェクトに取り組んでいます。私のコードでは、Java コードを生成するために DSL プログラムを分析しています。XExpressionを使用して既存のものを Java コードに変換するのは簡単ですXbaseCompilerが、それは私が必要としているものではありません。代わりに、別のプログラムを生成する必要があります。

現在、私は単純に Java コードを生成しています (つまり、文字列を構築しています)。私がやりたいのは、新しい を構築しXExpression、おそらく元の の一部を使用して、それを Java にコンパイルすることです。

さまざまなXExpressions にはゼロ引数のコンストラクターがあるため、1 つをインスタンス化し、いくつかのプロパティを設定することさえ試みました。ただし、コンパイラがクラッシュし、欠落しているプロパティを特定できません。

4

1 に答える 1

3

式を String として生成し、Xtext パーサーを使用して面倒な作業を行うことをお勧めします。つまり、String を解析して対応するXExpressionオブジェクトを作成します。それを適切に行う方法は、現在のコンテキスト (OSGI またはスタンドアロン) によって異なります。

以下は、Xtextドキュメントmainの「スクリプト言語」のスタンドアロンの例 (単純なメソッドから実行できます) です。

public class StandaloneParser {

    @Inject
    private IParser parser;

    public StandaloneParser() {
        Injector injector = new ScriptingStandaloneSetup().createInjectorAndDoEMFRegistration();
        injector.injectMembers(this);
    }

    public EObject parse(String input) {
        IParseResult result = parser.parse(new StringReader(input));
        if (result.hasSyntaxErrors()) {
            throw new RuntimeException("Syntax errors");
        }
        return result.getRootASTElement();
    }

}

発信者の例:

public class Main {

    public static void main(String[] args) {
        StandaloneParser parser = new StandaloneParser();
        EObject result = parser.parse("val answer = 7 * 6;");
        System.out.println(result);
    }

}

このような式をプログラムで作成しようとすると、苦労するでしょう。次のようになります (Xtend コード):

val factory = XbaseFactory.eINSTANCE
val expression = factory.createXVariableDeclaration => [
    name = "answer"
    right = factory.createXBinaryOperation => [
        leftOperand = factory.createXNumberLiteral => [
            value = "7"
        ]
        feature = // TODO retrieve the JvmOperation: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_multiply(int,int)
        rightOperand = factory.createXNumberLiteral => [
            value = "6"
        ]
    ]
]
于 2015-07-08T19:57:42.733 に答える