Xtext - 在不同文件中作用域

时间:2013-07-18 12:08:51

标签: xtext

我不太确定我是否理解了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] "]"
;

1 个答案:

答案 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示例,以便正确地演示您的问题。