使用Xtext格式化程序时观察到的格式不一致

时间:2014-09-11 05:16:43

标签: java xtext

我有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个元素,那么就会插入正确的换行符。

那么,任何人都可以帮忙,为什么会出现这种不一致的行为?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你有一个解析问题,这就是为什么格式化程序不应该像它应该的那样。 问题出在您的导入规则中:

Import:
    'import' importedNamespace=[DModel]
;

[DModel] [DModel |]的语法糖。 ID] 所以你的规则是解析ID而“specification / FunctionalTIM.spec”不是ID终端。

尝试类似:

Import:
    'import' importedNamespace=[DModel | ImportID]
;

其中

ImportID:
    ID  (('/' | '.') ID )*
;