首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式实例化Xbase XExpressions

以编程方式实例化Xbase XExpressions
EN

Stack Overflow用户
提问于 2015-07-09 01:49:42
回答 1查看 233关注 0票数 1

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

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

不同的XExpression都有零参数的构造器,所以我尝试实例化一个,甚至设置了一些属性。然而,编译器崩溃了,我找不出它丢失了哪些属性。

EN

回答 1

Stack Overflow用户

发布于 2015-07-09 03:57:43

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

下面是来自Xtext documentation的“脚本语言”的一个独立示例(可以从一个简单的main方法运行)

代码语言:javascript
复制
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();
    }

}

调用者示例:

代码语言:javascript
复制
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代码):

代码语言:javascript
复制
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"
        ]
    ]
]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31300021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档