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
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 –
@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
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 @@@@@@@@@@@@ '' '' –