我不太确定我是否理解了xText中的作用域过程如何工作,使用了几个模型文件。
在一个文件中引用工作正常,只需要指定ref=[referencedObject | ID]
行的规则,我可以使自动完成工作开箱即用;但是,我似乎无法访问另一个文件中的任何EObject
。我发现的信息对于那个案子并不是很明确,我真的不明白我应该做些什么才能让它发挥作用......
我尝试通过QualifiedName
进行引用,但我根本没有达到我应该让引用实际发生的位置 - 我的单独文件如何相互访问。
编辑:代码
File returns File:
UIRule | EventRule
;
QualifiedName:
ID ('.' ID)*
;
/* First file */
UIRule returns Ui:
{Ui}
"ui"
(screens+=ScreenRule (screens+=ScreenRule)*)?
;
ScreenRule returns Screen:
name=ID "as" "screen"
'{'
(elements+=GUIElementRule )*
'}'
;
GUIElementRule returns Button:
name=ID "as" "element"
;
/* Second file */
EventRule returns Event:
{Event}
"event"
rules+=RuleRule*
;
RuleRule returns Rule:
"on" "{" on=ButtonPressRule "}"
"do" "{" do=ActionRule "}"
;
ButtonPressRule returns Pressed:
"press" "[" source=[GUIElement | QualifiedName] "]"
;
ActionRule returns Open:
"open" "[" screen=[Screen | QualifiedName] "]"
;
答案 0 :(得分:0)
在一个文件中链接和在不同文件之间链接之间没有区别:在这两种情况下,链接目标都在索引中查找。所以通常这两种情况没有区别。顺便说一句,手册中的相关部分是Linking和(特别是)Scoping。
我尝试通过
QualifiedName
进行引用,但我根本没有达到我应该让引用实际发生的位置 - 我的单独文件如何相互访问。
语法的相关部分应如下所示(请注意ReferencedObject
中的上限):
ReferencedObject:
name=ID /* more stuff */;
Something:
name=ID ref=[ReferencedObject | QN];
QN:
ID ('.' ID)*;
只要ReferencesObject
有一个name
并且每个容器都有name
attribut,您就应该这样做。我假设你没有修改你语言的ScopeProvider
类。
编辑:
给定的语法不正确,不是自包含的。
第一条规则不能是QualifiedName
之类的数据类型规则。语法不会用这个编译。
NavigationRule
未使用且ActionRule
未知。我假设为了示例,ActionRule
可以替换为NavigationRule
。
未使用完整的EventRule
部分。因此,要么缺少顶级规则(请参阅第一点) OR 语法根本不知道如何使用事件规则解析文件。当然,在一个不可解析的文件中进行范围界定和交叉引用很困难; - )
所以:在修复NavigationRule
/ ActionRule
并使用以下规则作为第一个规则之后,我可以使用Xtext中的标准“MyDsl”示例生成插件而不需要进行更多修改:
File:
ui = UIRule | event = EventRule
;
然后我可以启动编辑器并编写这两个文件(在文件2中包含代码完成和正确的提议):
文件1:
S1 as screen {
S1E1 as element
S1E2 as element
}
S2 as screen {
S2E1 as element
S2E2 as element
}
文件2:
on { press [ S1.S1E1 ] }
do { open [ S2 ] }
在第二个文件中解析了交叉引用:我可以按住S2
并点击S1.S1E1
,然后Xtext跳转到定义。
因此,如果这对您不起作用,那么您应该从一个干净的项目开始或提供一个SSCCE示例,以便正确地演示您的问题。