1

我正在开发一个使用部分 Xbase 语法的 Xtext 项目。在我的代码中,我正在分析 DSL 程序以生成一些 Java 代码。使用将现有XExpression代码转换为 Java 代码很容易,XbaseCompiler但这不是我需要的。相反,我需要生成一个不同的程序。

目前我只是生成Java 代码(即构造一个字符串)。我想做的是构建一个新的XExpression,甚至可能使用原始的部分,然后将其编译为 Java。

不同XExpression的 s 有零参数的构造函数,所以我尝试实例化一个,甚至设置一些属性。但是编译器崩溃了,我无法确定它缺少哪些属性。

4

1 回答 1

3

我更愿意将表达式生成为字符串,然后使用 Xtext 解析器为您完成繁重的工作,即让它解析字符串并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 回答