Xtext:从 MyDsl 引用 Java class

Xtext: Reference a Java class from MyDsl

在我的 DSL 中,我想要一个如下所示的代码:

SomeType varName;

其中 SomeType 是 Java class。

稍后,如果假设 SomeType 是一个枚举 java-class,并且有人写

varName=SOME_VALUE

我想进行验证以查看 SomeType.java 是否确实将 SOME_VALUE 作为其枚举中的值。 我看到了这个教程 https://eclipse.org/Xtext/documentation/305_xbase.html

但我不确定这是我需要的(我需要导入 .mydsl 文件,而不仅仅是 jvm)。 任何帮助,将不胜感激。 谢谢。

如果要引用 Java 类型,请使用 org.eclipse.xtext.xbase.Xtype 作为超级语法。然后你可以写一个像

这样的规则
VariableDeclaration:
    type=JvmTypeReference name=ValidID ';';

表达你的代码示例。

如果你也想表达赋值,我建议使用 org.eclipse.xtext.xbase.Xbase 作为超级语法(它继承自 Xtype)并在任何你想引用来自 Java 的元素的地方使用 XExpression 规则,例如

VariableAssignment:
    variable=[VariableDeclaration|ValidId] '=' expression=XExpression;

为了使事情更简单,您还可以将 XExpression 用于变量声明(XVariableDeclaration 是一种特殊的 XExpression)和赋值(XAssignment 是另一种特殊的 XExpression)。那将允许写像

这样的东西
{
    var SomeType varName
    varName = SomeType.SOME_VALUE
}

单次调用 XBlockExpression(用花括号括起来的复合表达式):

MyFunkyRule:
    ...
    expressionBlock=XBlockExpression
    ...