我有一个xtext语法,每行包含一个声明。当我格式化代码时,所有声明都以同一行结束,删除了换行符。
由于我没有设法将语法更改为需要换行符,因此我想禁用删除换行符。我怎么做?如果有人可以告诉我如何在每个声明结束时要求换行,那么奖励积分。
语法的一部分:
update
示例数据
grammar com.example.Msg with org.eclipse.xtext.common.Terminals
hidden(WS, SL_COMMENT)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate msg_idl "http://www.example.com/ex/ample/msg"
Model:
MsgDef
;
MsgDef:
(definitions+=definition)+
;
definition:
type=fieldType ' '+ name=ValidID (' '* '=' ' '* const=Value)?
;
fieldType:
value = ( builtinType | header)
;
builtinType:
BOOL = "bool"
| INT32 = "int32"
| CHAR = "char"
;
header:
value="Header"
;
Bool_l:
target=BOOL_E
;
String_l:
target = ('""'|STRING)
;
Number_l:
Double_l | Integer_l | NegInteger_l
;
NegInteger_l:
target=NEG_INT
;
Integer_l :
target=INT
;
Double_l:
target=DOUBLE
;
terminal NEG_INT returns ecore::EInt:
'-' INT
;
terminal DOUBLE returns ecore::EDouble :
('-')? ('0'..'9')* ('.' INT) |
('-')? INT ('.') |
('-')? INT ('.' ('0'..'9')*)? (('e'|'E')('-'|'+')? INT )|
'nan' | 'inf' | '-inf'
;
enum BOOL_E :
true | false
;
ValidID:
"bool"
| "string"
| "time"
| "duration"
| "char"
| ID ;
Value:
String_l | Number_l
;
terminal SL_COMMENT :
' '* '#' !('\n'|'\r')* ('\r'? '\n')?
;
我已经尝试过:
string left
string top
string right
string bottom
答案 0 :(得分:0)
一般来说,将空格编码为语言本身是个坏主意。大多数情况下,最好以一种可以使用各种空格(空格,制表符,换行符......)来分隔标记的方式编写语言。
您应该为您的语言实现一个自定义格式化程序,在每个语句后插入换行符。 Xtext附带两个格式化程序API(一个旧的和一个新的,以Xtext 2.8开头)。我建议使用新的。
在此扩展AbstractFormatter2
并实施format
方法。
您可以在在线手册中找到一些信息:https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#formatting
以下博文中的更多解释:https://blogs.itemis.com/en/tabular-formatting-with-the-new-formatter-api
一些技术背景:https://de.slideshare.net/meysholdt/xtexts-new-formatter-api