以编程方式实例化Xbase XExpressions

时间:2015-07-08 17:49:42

标签: abstract-syntax-tree dsl xtext xbase

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

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

不同的SHOW VARIABLES LIKE 'key_buffer_size';具有零参数构造函数,因此我尝试实例化一个甚至设置一些属性。然而,编译器崩溃了,我无法确定它缺少哪些属性。

1 个答案:

答案 0 :(得分:3)

我更喜欢将表达式生成为String,然后使用Xtext解析器为您完成繁重的工作,即让它解析String并为您创建相应的XExpression对象。如何正确地做到这一点取决于你所处的环境(OSGI或独立)。

以下是来自Xtext documentation的“脚本语言”的独立示例(可以从简单的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"
        ]
    ]
]