我的语法如下所示:
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
答案 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。这很好。
但是,一旦我输入该值,就会抛出错误说 - "无法解析对名称的引用"
我在这里做错了什么?