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

时间:2017-11-13 10:32:08

标签: 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

此致

Anitha

2 个答案:

答案 0 :(得分:0)

有很多问题。

首先使用字符串进行引用,请查看https://christiandietrich.wordpress.com/2015/03/19/xtext-and-strings-as-cross-references/

要获得可选引用,您必须将语法更改为仅包含ID或仅包含引用。在IDOnly案例中,您可以执行类似

的操作
ModNameManipulator returns ModName: ref=[XXXX]

然后使用IDerivedStateComputer和SyntheticLinkingSupport创建/填充引用。

或者你适应链接没有抛出错误。 这两种解决方案都不是微不足道的,可能需要更深入的Xtext知识

答案 1 :(得分:0)

谢谢基督徒。我没有将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;

我在Scoping中进行了更改以合并列表,以便能够为内容辅助提供ModuleName和VarName。这很好。

但是,一旦我输入该值,就会抛出错误说 - "无法解析对名称的引用"

我在这里做错了什么?