格式化字符串内容 xtext 2.14

Formatting string content xtext 2.14

给定一个语法(下面的简化版本),我可以在语法的一部分中输入任意文本,是否可以格式化任意文本的内容?我了解如何格式化任意文本相对于其余语法的位置,但不知道是否可以格式化内容字符串本身?

示例语法

Model:
    'content' content=RT

terminal RT: // (returns ecore::EString:)
    'RT>>' -> '<<RT';

示例内容

content RT>>
# Some sample arbitrary text 
which I would like to format
<<RT

您可以将自定义 ITextReplacer 添加到字符串区域。 假设你有像

这样的语法
Model:
    greetings+=Greeting*;

Greeting:
    'Hello' name=STRING '!';

您可以在格式化程序中执行如下操作

def dispatch void format(Greeting model, extension IFormattableDocument document) {
    model.prepend[newLine]
    val region  = model.regionFor.feature(MyDslPackage.Literals.GREETING__NAME)
    val r = new AbstractTextReplacer(document, region) {
        override createReplacements(ITextReplacerContext it) {
            val text = region.text
            var int index = text.indexOf(SPACE);
            val offset = region.offset
            while (index >=0){
                it.addReplacement(region.textRegionAccess.rewriter.createReplacement(offset+index, SPACE.length, "\n"))
                index = text.indexOf(SPACE, index+SPACE.length())   ;
            }
            it
        }
    }
    addReplacer(r)
}

这会变成这个模型

Hello "A B C"!

进入

Hello "A
B
C"!

当然,您需要想出更复杂的格式化程序逻辑。 也见