如何在Xtend中将AFTER分隔符放在最后一项之后

时间:2015-09-07 13:34:57

标签: xtext xtend

我使用Xtend从我的Xtext语法生成一些文本输出。我的问题非常简单,但我无法弄清楚阅读文档和示例,所以请给我建议!

让我们假设,我有一些包含一些项目的清单。我使用SEPARATOR功能为FOR循环中的每个项生成一行。最后我想使用AFTER有一个最后的分隔符。以下是演示它的示例代码:

val list = #["a", "b", "c"]
'''
«FOR item : list SEPARATOR "," AFTER ","»
   «item»
«ENDFOR»
'''

通过这种方式,我收到以下输出:

a,
b,
c
,

现在的问题是:如何将,分隔符紧跟在c之后,而不是在新行上?对我来说,正确格式化输出非常重要(它实际上比a,b,c更复杂,并且分隔符的位置很重要)。我想要这个:

a,
b,
c,

专家,请帮忙!

1 个答案:

答案 0 :(得分:5)

在您的简单示例中,由于SEPARATOR和AFTER相同,您应该完全跳过分隔符/后面的内容并使用

'''
   «FOR item : list»
      «item»,
   «ENDFOR»
'''

在Xtend的空格检测中跳过FOR和ENDFOR之后的换行符。问题是在循环执行后应用了AFTER,并且循环体包含一个进入输出的尾随换行符(grayspace)。您可以通过将整个循环写入一行来克服这个问题,例如:

'''
   «FOR item: list SEPARATOR ',\n' AFTER ',\n'»«item»«ENDFOR»
'''

并提取循环体变长的方法。为了更好的可读性,您可以在guillemets中添加任意数量的空格,例如

'''
   «FOR item: list SEPARATOR ',\n' AFTER ',\n'»«
      item
   »«ENDFOR»
'''

对于较小的身体,您可能还会考虑更喜欢join()

'''
   «list.join(',\n')»,
'''

或更一般的map(),reduce()无论如何。