我更愿意将表达式生成为字符串,然后使用 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"
]
]
]