我正在开发一个使用Xbase语法部分的Xtext项目。在我的代码中,我分析了DSL程序以生成一些Java代码。使用XExpression
将现有XbaseCompiler
转换为Java代码很容易,但这不是我需要的。相反,我需要生成一个不同的程序。
目前我只是简单地生成Java代码(即构造一个String)。我想要做的是构建一个新的XExpression
,甚至可能使用原始的XExpression
部分,然后将其编译为Java。
不同的SHOW VARIABLES LIKE 'key_buffer_size';
具有零参数构造函数,因此我尝试实例化一个甚至设置一些属性。然而,编译器崩溃了,我无法确定它缺少哪些属性。
答案 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"
]
]
]