我正在开发一个使用部分Xbase语法的Xtext项目。在我的代码中,我分析了DSL程序,以便生成一些Java代码。使用XbaseCompiler将现有的XExpression转换成Java代码很容易,但这不是我所需要的。相反,我需要生成一个不同的程序。
目前,我只是在生成Java代码(即构造一个字符串)。我想要做的是构建一个新的XExpression,甚至可能使用原来的部分,然后将其编译成Java。
不同的XExpression都有零参数的构造器,所以我尝试实例化一个,甚至设置了一些属性。然而,编译器崩溃了,我找不出它丢失了哪些属性。
发布于 2015-07-09 03:57:43
我更喜欢将表达式生成为字符串,然后使用Xtext解析器为您做繁重的工作,即让它解析字符串并为您创建相应的XExpression对象。如何正确地做到这一点取决于您所处的上下文(OSGI或standalone)。
下面是来自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"
]
]
]https://stackoverflow.com/questions/31300021
复制相似问题