2016-10-06 1 views
0

Meine Grammatik ist gegeben durch:Xtext: Wie Code zu formatieren, wo Block eingerückt werden muss

Model: 
    'module' (mn=ID)? 
     (func+=Function)+ 
    'end_module' 
; 

Function: 
    'function' name=ID '('')' 
     (vars+=ID)* 
    'end_function' 
; 

kann ich das Token wie 'Funktion' finden, '(' usw.

  • Wie Kann Wenn eine neue Zeile nach dem Token "Modul" erzwingen, wenn die optionale Daten-MN nicht existiert und nach Mn, wenn es existiert?
  • Wie kann ich die Block beginnen 'Modul' und 'End_Module' sowie 'Funktion einrücken 'und' Ende_Funktion '?

Die Formatierung Ich suche:

module test 
    function fdf() 
    str1 
    str2 
    end_function 

    function ff() 
    end_function 
end_module 

Bisher habe ich die Formatierungs Stubs erzeugen, indem Sie: Formatter = { generateStub = true }

Antwort

3

, die eher geradlinig sein sollten, z.

@Inject extension MyDslGrammarAccess 

def dispatch void format(Model model, extension IFormattableDocument document) { 
    model.regionFor.keyword(modelAccess.end_moduleKeyword_3).prepend[newLine] 
    if (model.mn != null) { 
     model.regionFor.feature(MyDslPackage.Literals.MODEL__MN).append[newLine] 
     interior(
      model.regionFor.feature(MyDslPackage.Literals.MODEL__MN), 
      model.regionFor.keyword(modelAccess.end_moduleKeyword_3) 
     ) [indent] 
    } else { 
     model.regionFor.keyword(modelAccess.moduleKeyword_0).append[newLine] 
     interior(
      model.regionFor.keyword(modelAccess.moduleKeyword_0), 
      model.regionFor.keyword(modelAccess.end_moduleKeyword_3) 
     ) [indent] 
    } 
    for (Function func : model.getFunc()) { 
     func.format; 
    } 
} 

def dispatch void format(Function function, extension IFormattableDocument document) { 
    function.regionFor.keyword(functionAccess.functionKeyword_0).append[newLine].prepend[newLine] 
    function.regionFor.keyword(functionAccess.end_functionKeyword_5).prepend[newLine] 
    interior(
     function.regionFor.keyword(functionAccess.functionKeyword_0), 
     function.regionFor.keyword(functionAccess.end_functionKeyword_5) 
    ) [indent] 
} 
1

Wie in Max's Answer vorgeschlagen, es ist Es ist möglich mit whitespace-fähigen Sprachen ab Xtext v2.8 umzugehen. Check it out!.

In Ihrem Fall, ich denke, Sie Ihre Grammatik definieren wie folgt:

Model: 
    'module' (mn=ID)? 
    BEGIN 
     (func+=Function)+ 
    END 
    'end_module' 
; 

Function: 
    'function' name=ID '('')' 
    BEGIN 
     (vars+=ID)* 
    END 
    'end_function' 
; 

terminal BEGIN: 'synthetic:BEGIN'; 
terminal END: 'synthetic:END'; 

Falls Sie auch wie folgt ‚leer-bodied‘ Funktionen wollen würde erlauben, ich denke, die Regel oben ändern sollte :

Function: 
    'function' name=ID '('')' 
    (BEGIN 
     (vars+=ID)* 
    END)? 
    'end_function' 
; 

Hoffe es hilft!

+0

Ja, es hilft sehr. Ich muss den Code von Hand formatieren. wie muss der body von 'format (Model, extension IFormattableDocument)' aussehen um automatische Formatierung zu machen? – Johan

+1

Sie können das Beispielprojekt 'Home Automation language' von Xtext zusammen mit der Dokumentation über Whitespace-Aware Languages ​​(in der obigen Antwort verlinkt) betrachten. Ich empfehle Ihnen, mit der Arbeitsablaufdatei (.mwe2) zu beginnen, um zu verstehen, wie Sie einen benutzerdefinierten Formatiererstub generieren. Dann enthalten 'org.eclipse.xtext.example.homeautomation.formatting2.RuleEngineFormatter' und 'org.eclipse.xtext.example.homeautomation.parser.antlr' die tatsächliche Implementierung, die Sie für Ihre Sprache anpassen müssen. –

+0

In dem Beispiel 'RuleEn gineFormatter' verwendet' org.eclipse.xtext.example.homeautomation.ruleEngine.Declaration', aber mein Projekt erstellt keine ähnlichen Dateien. Alle zugehörigen 'org.eclipse.xtext.example.homeautomation.ruleEngine. *' Fehlen in meinem Projekt. – Johan

Verwandte Themen