在Xtext格式化程序中禁用包装

时间:2018-05-08 11:29:41

标签: xtext

我有一个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

1 个答案:

答案 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