2016-04-01 13 views
0

Ich bin neu in Xtext und ich habe folgende Ausgabe: Unter jeder "Fehler-ID:" Zeile kann ich jedes druckbare Zeichen mit Leerzeichen/Tabs zwischen erwarten. Meine Sprache ist einrückungsbasiert, so dass dieses "Terminal" nicht mit Leerzeichen beginnen kann.Xtext Terminal Überlappung

Bearbeiten /: Beispiel-Code für diese Sprache würde wie folgt aussehen:

package somepkg:  
    error UNKNOWN: 
     Unknown error. 
    error ZERO_DIVISION: 
     Do not divide by zero you {0} donkey!. 

Closest i in dieser Sprache Spezifikation bekommen, ist dies:

grammar com.example.lang.ermsglang.Ermsglang with org.eclipse.xtext.xbase.Xbase hidden(WS) 

import "http://www.eclipse.org/emf/2002/Ecore" as ecore 
generate ermsglang "http://www.example.com/lang/ermsglang/Ermsglang" 

Model: 
    {Model} 
    'package' name=ENAME ':' 
    (BEGIN 
     (expressions+=Error)+ 
    END)? 
; 

Error: 
    {Error} 
    'error' name=ENAME ':' 
    (BEGIN 
     (expressions+=Anything)+ 
    END)? 
; 

Anything: 
    (ENAME|EMSG|INT) 
; 

//Terminals must be disjunctive 
terminal ENAME: 
    ('_'|'A'..'Z') ('_'|'A'..'Z')* 
; 

terminal EMSG: 
    ('!'..'/'|':'..'@'|'['..'~')+ 
; 

terminal SL_COMMENT: 
    '#' !('\n'|'\r')* ('\r'? '\n')? 
; 

// The following synthetic tokens are used for the indentation-aware blocks 
terminal BEGIN: 'synthetic:BEGIN'; // increase indentation 
terminal END: 'synthetic:END';  // decrease indentation 

Aber noch, dies ermöglicht entweder ENAME oder EMSG- oder INT-Terminals, so dass Sie beispielsweise Zahlen nicht mit Zeichen mischen können. Das Problem ist Terminals hat disjunctive zu sein, so, wenn ich Regel "ANYTHING" wie folgt ändern:

terminal ANYTHING: 
    (ENAME|EMSG|INT)+ 
; 

oder

Anything: 
    (ENAME|EMSG|INT)+ 
; 

wird ein Problem mit Lexer/Parser sein, die nicht bestimmen können, welches Endgerät ist der. Wie man mit dieser Situation umgeht? Vielen Dank.

// Edit: zu Christian Vielen zum Beispiel arbeiten, gibt es noch ein Problem mit SL_COMMENT, in diesem Beispiel zweite Fehler Schlüsselwort wird mit der Meldung markiert

fehlt RULE_END bei 'Fehler'

package A : 
    error B : 
     a 
     #bopsa Akfkfndsfio 
    error A_C_S : 
     :aasdasdasd 
+0

warum von xbase erben oder irgendein anderes Terminal. Lexing ist kontextfrei, also müssen Sie auf lexer level eindeutig sein. Wenn Sie von xbase erben, erben Sie eine Menge von Terminalregeln –

+0

@ChristianDietrich, weil ohne es die speziellen Terminals: 'terminal BEGIN: 'synthetisch: BEGIN'; // Indentation vergrößern' 'terminal END: 'synthetic: END'; // verkleinern indentation funktionieren nicht. Lexing ist kontextfrei, aber die Sprache selbst nicht. Es hängt vom Kontext der Eindrucktiefe ab. – Smarty77

+0

können Sie einen Fehler dafür einreichen. Wenn Sie erben, müssen Sie der AllStuff-Regel ID, INT usw. hinzufügen oder sie auf etwas überschreiben, das in den Modellen z. '' '@@@@@@@@@@@@ INT @@@@@@@@@@@@ '' '' –

Antwort

0

die follwoing Grammatik funktioniert für mich

grammar org.xtext.example.mydsl3.MyDsl hidden (WS, SL_COMMENT) 

generate myDsl "http://www.xtext.org/example/mydsl3/MyDsl" 

import "http://www.eclipse.org/emf/2002/Ecore" as ecore 

Model: 
    {Model} 
    'package' name=ENAME ':' 
    (BEGIN 
     (expressions+=Error)+ 
    END)? 
; 

Error: 
    {Error} 
    'error' name=ENAME ':' 
    (BEGIN 
     (expressions+=Anything)+ 
    END)? 
; 

Anything: 
    (ENAME|EMSG|INT|':') 
; 

//Terminals must be disjunctive 
terminal ENAME: 
    ('_'|'A'..'Z'|'a'..'z') ('_'|'A'..'Z'|'a'..'z')* 
; 
terminal INT returns ecore::EInt: ('0'..'9')+; 

terminal EMSG: 
    ('!'..'/'|';'..'@'|'['..'~')+ 
; 

terminal SL_COMMENT: 
    '#' !('\n'|'\r')* ('\r'? '\n')? 
; 



// The following synthetic tokens are used for the indentation-aware blocks 
terminal BEGIN: 'synthetic:BEGIN'; // increase indentation 
terminal END: 'synthetic:END';  // decrease indentation 

terminal WS   : (' '|'\t'|'\r'|'\n')+; 

terminal ANY_OTHER: .; 
+0

Hallo, danke für deine Antwort, sieht dann aus wie es ohne xbase funktioniert. Ich habe es nach deinem Grammatikbeispiel implementiert. Ich untersuche immer noch ein Problem tho (das ist sogar in diesem Beispiel) und das ist SL_COMMENT, das einen Fehler verursacht. Siehe beispielsweise Änderungen. – Smarty77

+0

Okay, es wurde gelöst, das Problem war (in diesem Beispiel) im Zeichenbereich ''!' .. '/'' was '#' Zeichen enthielt und das war natürlich ein Konflikt mit SL_comment Terminal-Definition. – Smarty77