交叉引用指的是哪个实体?

Which entity does a cross-reference refer?

如果我有以下输入

test = 3; //first
test = test + 3; //second

用看起来像这样的语法解析(例如)

Declaration:
    name=ID "=" DeclarationContent
;

    DeclarationContent:
        number=INT ("+" DeclarationContent)?
        | reference=[Declaration] ("+" DeclarationContent)?
    ;

引用指的是哪个声明(查看我示例中的第二个声明)?或者换句话说,引用 "test"(第二个声明)是指第一个声明 ("test = 3;") 还是直接指向它自己 ("test = test+ 3"),因此在层次结构中是一个循环。

问候 Krzmbrzl

Xtext 将始终 link 交叉引用 [Declaration] 到由给定 ID 标识的第一个元素。在您的示例 hello + 3 中,hello 后面的交叉引用将解析为第 1 行中的声明 hello。但是如果您有 个元素 相同范围(可见性容器)内使用相同(限定)名称 Xtext 将抛出异常。你应该

  1. 实施您自己的 ScopeProvider(使用 your.dsl.scoping.YourDslScopeProvider 中生成的存根)来解决此问题或
  2. 使用组合检查自动验证名称。

    fragment = validation.JavaValidatorFragment auto-inject {
        composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
    }