我有xtext语法如下:
MyDSLModel:
(dmodel=DModel)
;
DModel:
{DModel}
(importSection=ImportSection)?
(
(groups+=Group) |
(variableDefinition+=VariableDefinition)
)*
;
ImportSection:
(importDeclarations+=Import)+
;
Import:
'import' importedNamespace=[DModel | ImportID]
;
ImportID:
ImportIdentifier(('.'|'/')ImportIdentifier)*
;
Group:
'group' name=Identifier
;
VariableDefinition:
'var' name=Identifier
;
ImportIdentifier:
Identifier
| 'dB'
| 'm'
| 'true' | 'false'
| 'parallel' | 'sequential'
| 'sites' | 'routing'
;
Identifier:
PortIdentifier
| 'mode'
| 'options'
;
PortIdentifier:
SINGLE_CHARACTER_ID | ID
| 'action'
| 'config'
| 'disabled'
| 'enum'
| 'extension'
| 'group'
| 'import'
| 'mod'
| 'set'
| 'setup'
;
terminal ID:
'^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')+
;
terminal SINGLE_CHARACTER_ID:
('a'..'z'|'A'..'Z'|'_')
;
现在,我有一个使用这个语法编写的文件,如下所示:
import specification/FunctionalTIM.spec
import specification/FunctionalLEV.spec
import specification/FunctionalWVT.spec
group GR1
group GR2
var v1
var v2
我正在尝试使用以下实现格式化此代码
public class MyDSLFormatter extends AbstractDeclarativeFormatter {
@Inject
private MyDSLGrammarAccess grammarAccess;
@Override
protected void configureFormatting(FormattingConfig c) {
ImportElements importAccess = grammarAccess.getImportAccess();
c.setLinewrap().after(importAccess.getRule());
GroupElements groupAccess = grammarAccess.getGroupAccess();
c.setLinewrap().after(groupAccess.getRule());
VariableDefinitionElements varDefAccess = grammarAccess
.getVariableDefinitionAccess();
c.setLinewrap().after(varDefAccess.getRule());
}
现在,我面临的问题是格式不一致,当我的文件中存在Import
元素时如果我的文件中包含import语句,那么VariableDefinition
的换行符(在规则)没有生效。因此,CTRL+SHIFT+F
将文件设为
import specification/FunctionalTIM.spec
import specification/FunctionalLEV.spec
import specification/FunctionalWVT.spec
group GR1 group GR2 var v1 var v2
注意:
如果我只有Group
个元素和VariableDefinition
个元素,那么就会插入正确的换行符。
那么,任何人都可以帮忙,为什么会出现这种不一致的行为?提前谢谢!
答案 0 :(得分:0)
我认为你有一个解析问题,这就是为什么格式化程序不应该像它应该的那样。 问题出在您的导入规则中:
Import:
'import' importedNamespace=[DModel]
;
[DModel] 是 [DModel |]的语法糖。 ID] 所以你的规则是解析ID而“specification / FunctionalTIM.spec”不是ID终端。
尝试类似:
Import:
'import' importedNamespace=[DModel | ImportID]
;
其中
ImportID:
ID (('/' | '.') ID )*
;