我们如何交叉引用 Xtext 中的多个项目?

How do we cross reference to multiple items in Xtext?

我的语法如下所示:

Module: MOD mid=ModId ;

Stmt: CALL nam=ModName ';';

ModName: (idn1=[ModId|ID] | ('"' idn2=[ModId|ID] '"') | (idn3=ID idn4=ID));

基本上,我有一个提到模块名称的声明。所以当我稍后尝试调用该模块时,它应该提示我定义的模块名称(带或不带引号)并且还允许我输入一个新的变量名称(这不是模块名称)。

如何实现?我能够实现引用模块名称或定义名称,而不是两者。

示例程序:

Module add

Module subtract

Module divide

call add;    //referencing module name

call "subtract";  // referencing module name in quotes

call operation;   // without reference

此致,

阿妮莎

这有很多问题。

首先要用字符串引用看看https://christiandietrich.wordpress.com/2015/03/19/xtext-and-strings-as-cross-references/

要获得可选参考,您必须将语法更改为仅具有 ID 或仅具有参考。在 IDOnly 的情况下,你可以做类似

ModNameManipulator returns ModName: ref=[XXXX]

然后使用 IDerivedStateComputer 和 SyntheticLinkingSupport 来 create/populate 引用。

或者您调整链接以避免抛出错误。 这两种解决方案都不是微不足道的,可能需要更深入的 Xtext 知识

谢谢克里斯蒂安。我犯了一个愚蠢的错误,没有将 ModId 分配给名称。现在内容辅助工作正常。

现在的语法如下所示:

Module: 'MOD' mid=ModuleName;
ModuleName: name = identifier;

Var: d=DataType v=VarName;
VarName:  name=identifier;

Stmt:  'Call' ((idn1=[Names|ID] 'Mod.')| (idn3=[Names|ID] idn4=ID '.'));

Names: id = ModuleName| id2 = VarName;

我对合并列表的范围进行了更改,以便能够为内容辅助提供 ModuleName 和 VarName。这很好用。

然而,一旦我输入值,它就会抛出错误提示 - "Couldn't resolve reference to Names"

我做错了什么?