Xtext DSL 插件只为文件的第一行提供关键字建议
Xtext DSL plugin only provides keyword suggestions for the first line of the file
我一直在使用 Xtext 将 DSL 开发为 eclipse 插件,到目前为止,我已经能够达到运行时 eclipse 应用程序在按下 Ctrl+space 时提供建议列表的程度。但是,建议仅针对文件的第一行显示。之后无论按多少次Ctrl+space,提示都不来了。下面是我的 Xtext 语法:
Domainmodel:
(elements+=MainElement)
;
MainElement:
ProjectionName | ProjectionComponent | LayerSpecification |
Description | Capability | Category | ServiceGroup |
IncludeFragment | {MainElement} Override | {MainElement} Overtake
;
ProjectionName:
'projection' modelName=ID ';'
;
ProjectionComponent:
'component' componentName=ID ';'
;
LayerSpecification:
'layer' layerName=ID ';'
;
Description:
'description' string=STRING ';'
;
Capability:
'capability' type=('Online' | 'Offline') ';'
;
Category:
'category' type=('Integration' | 'ExternalB2B' | 'Users') ';'
;
ServiceGroup:
'servicegroup' type=('Mobility' | 'Reporting') ';'
;
IncludeFragment:
('@Dynamic_Component_Dependency' componentName=ID) 'include' 'fragment' fragmentToIncludeName=ID ';'
;
Override:
'@Override'
;
Overtake:
'@Overtake'
;
我也尝试了另一个没有这个问题的更简单的例子(下面提到):-
Domainmodel: (elements+=MainElement)* ;
MainElement: FileName | Type ;
Type: Component | Layer | Description | Category | Entity | Comment ;
FileName: 'projection' name=ID ';' ;
Component: 'component' name=ID ';' ;
Layer: 'layer' name=ID ';' ;
Description: 'description' string=STRING ';' ;
List: Users | Developers ;
Users: 'Users' ;
Developers: 'Developers' ;
Category: 'category' lists=List ';' ;
Entity: 'entityset' name=ID 'for' name2=ID ';' ;
Comment: '----------' comment=ID '----------' ;
谁能帮我理解为什么提到的问题发生在第一个代码而不是第二个代码上?
谢谢!
您的第二个语法在规则 Domainmodel: (elements+=MainElement)* ;
中使用了零对多基数,而您的第一个语法似乎缺少 *
符号 Domainmodel: (elements+=MainElement);
。
将那个固定到 Domainmodel: (elements+=MainElement)*;
会有所帮助。
我一直在使用 Xtext 将 DSL 开发为 eclipse 插件,到目前为止,我已经能够达到运行时 eclipse 应用程序在按下 Ctrl+space 时提供建议列表的程度。但是,建议仅针对文件的第一行显示。之后无论按多少次Ctrl+space,提示都不来了。下面是我的 Xtext 语法:
Domainmodel:
(elements+=MainElement)
;
MainElement:
ProjectionName | ProjectionComponent | LayerSpecification |
Description | Capability | Category | ServiceGroup |
IncludeFragment | {MainElement} Override | {MainElement} Overtake
;
ProjectionName:
'projection' modelName=ID ';'
;
ProjectionComponent:
'component' componentName=ID ';'
;
LayerSpecification:
'layer' layerName=ID ';'
;
Description:
'description' string=STRING ';'
;
Capability:
'capability' type=('Online' | 'Offline') ';'
;
Category:
'category' type=('Integration' | 'ExternalB2B' | 'Users') ';'
;
ServiceGroup:
'servicegroup' type=('Mobility' | 'Reporting') ';'
;
IncludeFragment:
('@Dynamic_Component_Dependency' componentName=ID) 'include' 'fragment' fragmentToIncludeName=ID ';'
;
Override:
'@Override'
;
Overtake:
'@Overtake'
;
我也尝试了另一个没有这个问题的更简单的例子(下面提到):-
Domainmodel: (elements+=MainElement)* ;
MainElement: FileName | Type ;
Type: Component | Layer | Description | Category | Entity | Comment ;
FileName: 'projection' name=ID ';' ;
Component: 'component' name=ID ';' ;
Layer: 'layer' name=ID ';' ;
Description: 'description' string=STRING ';' ;
List: Users | Developers ;
Users: 'Users' ;
Developers: 'Developers' ;
Category: 'category' lists=List ';' ;
Entity: 'entityset' name=ID 'for' name2=ID ';' ;
Comment: '----------' comment=ID '----------' ;
谁能帮我理解为什么提到的问题发生在第一个代码而不是第二个代码上?
谢谢!
您的第二个语法在规则 Domainmodel: (elements+=MainElement)* ;
中使用了零对多基数,而您的第一个语法似乎缺少 *
符号 Domainmodel: (elements+=MainElement);
。
将那个固定到 Domainmodel: (elements+=MainElement)*;
会有所帮助。