式を String として生成し、Xtext パーサーを使用して面倒な作業を行うことをお勧めします。つまり、String を解析して対応する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"
]
]
]