1

我不太确定我是否了解范围界定过程在 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] "]"
;
4

1 回答 1

0

在一个文件内链接和在不同文件之间链接之间没有区别:在这两种情况下,链接目标都是在索引中查找。所以通常这两种情况没有区别。顺便说一句,手册中的相关部分是Linking和(尤其是)Scoping

我尝试通过 引用QualifiedName,但我根本不知道我应该在哪里进行引用 - 我的单独文件如何相互访问。

语法的相关部分应如下所示(请注意 中的大写字母ReferencedObject):

ReferencedObject:
    name=ID /* more stuff */;

Something:
    name=ID ref=[ReferencedObject | QN];

QN: 
    ID ('.' ID)*;

只要ReferencesObject有一个name并且它的每个容器也有一个name属性,你就应该完成。我假设您没有修改ScopeProvider您的语言类别。


编辑:

给定的语法不正确且不是自包含的。

  • 第一条规则不能是数据类型规则,例如QualifiedName. 语法不会用这个编译。

  • NavigationRule未使用且ActionRule未知。我假设为了示例ActionRule,可以替换为NavigationRule.

  • EventRule不使用完整的部分。因此,要么缺少顶级规则(见第一点),要么语法根本不知道如何使用 Event-Rules 解析文件。当然,在不可解析的文件中进行范围界定和交叉引用是很困难的;-)

所以:在修复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 ] }

在第二个文件中解决了交叉引用:我可以按住 shift 键单击,S2然后S1.S1E1Xtext 跳转到定义。

因此,如果这对您不起作用,那么您应该从一个干净的项目开始,或者提供一个SSCCE示例来正确演示您的问题。

于 2013-07-18T14:27:35.887 回答