Java Xtext语法变量定义/引用

Java Xtext语法变量定义/引用,java,grammar,xtext,ebnf,Java,Grammar,Xtext,Ebnf,[任何类型]实现语法规则初始化应该是预定义变量的值或引用。 对于Integer,它看起来类似于您从java中了解到的: public int i = 3; 为什么下面的语法会引发异常 Integer returns ecore::ELong: (Plus|Minus)? INT; IntegerRealisation: {Integer} Integer | ref=[Integer]; 例外情况: Caused by: java.io.IOException: Genera

[任何类型]实现语法规则初始化应该是预定义变量的值或引用。 对于Integer,它看起来类似于您从java中了解到的:

public int i = 3;
为什么下面的语法会引发异常

Integer returns ecore::ELong:
  (Plus|Minus)? INT;

IntegerRealisation:
  {Integer} Integer | 
  ref=[Integer];
例外情况:

Caused by: java.io.IOException: Generated EMF Model incomplete: The context 'IntegerRealisation' is not valid for type 'Integer'
Recommended contexts for type 'Integer': 
Other valid contexts for type 'Integer': .... The context 'IntegerRealisation' is valid for types: Integer, IntegerRealisation
为什么同一错误的第一行和最后一行彼此不一致


这里出了什么问题?

您尝试引用整数文本,而不是任何其他整数类型的变量。实施科学技术。像

public int i = 5; // 5 is a value
public int j = i; // i reference to a predefined variable
您的语法定义应该如下所示

VariableDeclaration:
    modifiers+=Modifier* type=Type name=ID ('=' value=VariableValue)? ';';

VariableValue:
    TypedLiteral | VariableReference;

TypedLiteral:
    IntegerLiteral | ...;

IntegerLiteral:
    value=INTVAL;

terminal INTVAL returns ecore::ELong:
    (Plus|Minus)? INT;

VariableReference:
    ref=[VariableDeclaration|QualifiedName];
如您所见,它从定义变量的规则开始。这个变量有一个name属性,这对于后面的引用实现非常重要。实际值分配是可选的,因为我会这样做!在这一点上,抽象规则VariableValue非常重要,它将对文本或文本进行建模。常量值或对任何其他变量的引用

如果要引用任何预定义变量,将使用其他变量名称,但不使用其值。由于这个原因,我们还需要VariableReference,它定义了我们通过管道操作符|后面的限定名引用管道操作符前面的任何其他变量

为了确保类型安全,您必须实现yourdsl.validation.YourDslValidator类来检查文本是否与类型兼容,以及引用变量的类型是否与类型兼容

编辑:我优化了一下语法。第一个版本有点不清楚

回答您的其他问题:

VariableValue的返回类型是什么

VariableValue本身是所有可能值的常见但抽象的返回类型。它类似于java.lang.Number,它是java.lang.Integer、java.lang.Double、

这里的问题是单词类型本身在这里是不明确的。值的类型将是int IntegerLiteral extends TypedLiteral extends VariableValue,但AST节点的类型是IntegerLiteral或VariableReference

要确定VariableReference的值类型,必须查看引用的VariableDeclaration VariableReferencevd1.getValue.getRef.getValue的value属性。永远不会有限制值类型

要为VariableDeclaration.value属性设置值,您需要IntegerLiteral最显式的TypedLiteral或VariableReference。

VariableValue的返回类型是什么?默认值为ecore::EString。但由于IntegerLiteral返回一个ELong和VariableReference,我猜只能是restring,或者更可能的是EReference,所以不会有常见的超类型。。。EMF类需要一个VariableValue,但这不是一个实例!