Parserschnittstelle |
Top Previous Next |
Skripte > Klassen-Elemente und C++-Befehle > Parserklasse-Methoden > Parserzustand
Zu einem bestimmten Zeitpunkt ist der Zustand des Parsprozesses durch die aktuelle Position im Eingabetext und durch die bisher erkannten Token und Regeln gekennzeichnet. Auf einige der Eigenschaften des aktuellen Zustands kann der Interpreter zugreifen. Der Zustand insgesamt ist in TETRA durch die Variable xState repräsentiert.
Anmerkung zu den Bezeichnungen xState und State:
Im Laufe der Entwicklung des TextTransformers wurde statt des Namens xState auch State verwendet. Das vorangestellte 'x' soll zum Ausdruck bringen, dass es sich um eine Parameter-Variable handelt. State wurde als Klassenelement benutzt. Mittlerweile ist der Parser-Zustand nur noch als Parameter vorhanden. Deshalb wird jetzt überall die Bezeichnung xState verwendet. State kann aber weiterhin als Synonym für xState verwendet werden. Für den Interpreter macht die Verwendung von State oder xState keinen Unterschied. Siehe auch: xState als Parameter einer Klassenmethode.
Einzelne Eigenschaften des Zustands können über folgende Befehle ermittelt werden:
unsigned int size() const unsigned int length(int sub = 0) const stri str(int sub) const str str() const str text(unsigned int from) const str text(unsigned int from, unsigned int to) const str copy() const int itg() const int itg(int sub) const double dbl() const double dbl(int sub) const
str next_str() const str next_copy() const str next_str(int sub) const unsigned int next_size() const unsigned int next_length(int sub = 0) const
str lp_str() const str lp_str(int sub) const str lp_copy() const unsigned int lp_length(int sub = 0) const
str la_str() const str la_copy() const str la_str(int sub) const unsigned int la_length(int sub = 0) const
int LastSym() const unsigned int Line() const int Col() const unsigned int Position() const unsigned int LastPosition() const unsigned int NextPosition() const void SetPosition(unsigned int xi );
bool IsSubCall() const str ProductionName() const str BranchName() const
int GetState() void SetState(int xeState);
Beispiel:
Quelltext: one two three four Produktion: "one" "two" "three" "four"
Wenn "two" zuletzt erkannt wurde, gilt:
0123456789... one two three four
xState.str() : two xState.copy() : two xState.length() : 3 xState.size() : 1 xState.Line() : 1 xState.Col() : 8 xState.LastPosition() : 4 xState.Position() : 7 xState.NextPosition() : 8
unsigned int size() const
gibt an, wie viele Unterausdrücke an der aktuellen Erkennung beteiligt sind. in diese Zahl eingeschlossen ist die gesamte Erkennung (als Unterausdruck mit dem Index Null).
str str(int sub) const
gibt den Textausschnitt an, der von dem Unterausdruck mit dem Index n erkannt wurde. Hierbei steht der Index 0 für die gesamte Erkennung, der Index 1 für den 1. Unterausdruck usw. Wird "str" ohne Parameter aufgerufen, so wird die gesamten Erkennung ( = Erkennung mit dem Index 0) zurückgegeben.
str text(unsigned int from) const str text(unsigned int from, unsigned int to) const
Mit der Funktion text erhält man Ausschnitte des Quelltextes. Wird sie mit nur einem Parameter aufgerufen, liefert sie den Text ab der Position from bis zum Ende des aktuell erkannten Tokens. Mit dem zweiten Parameter kann das Ende des Textabschnitts bestimmt werden. Falls from oder to größer sind als die Länge des Quelltextes, oder falls to größer ist als from wird ein Leerstring zurückgegeben. Falls nur to größer ist als die Länge des Quelltextes wird der String von from bis zum Ende des Textes zurückgegeben.
str copy() const
gibt den String vom Ende des letzten erkannten Tokens bis zum Ende des aktuell erkannten Tokens zurück. xState.copy() ist equivalent zu xState.str(-1) + xState.str():
unsigned int length(int sub = 0) const
gibt die Länge des Textausschnitts an, der von dem Unterausdruck mit dem Index n erkannt wurde. Hierbei steht der Index 0 für die gesamte Erkennung, der Index 1 für den 1. Unterausdruck usw. Wird "length" ohne Parameter aufgerufen, so wird die Länge der gesamten Erkennung ( = Erkennung mit dem Index 0) zurückgegeben.
int LastSym() const
gibt die Nummer des zuletzt erkannten Tokens zurück
unsigned int Line() const
gibt die Zeilennummer zurück in der das zuletzt erkannte Token im Quelltext steht. Die Zeilennummerierung beginnt mit 1 in der ersten Zeile.
int Col() const
gibt die Spaltennummer zurück in der das zuletzt erkannte Token im Quelltext steht. Die Spaltennummerierung beginnt mit 1 in der ersten Spalte.
unsigned int LastPosition() const
gibt die Position des zuletzt erkannten Tokens zurück, d.h. die Anzahl der Zeichen zwischen der Startposition und dem ersten Zeichen des erkannten Tokens.
unsigned int Position() const
gibt die Position zurück, an der das zuletzt erkannte Token endet. Diese Position ist um xState.length() größer als xState.LastPosition().
unsigned int NextPosition() const
gibt die Position zurück, an der das nächste Token beginnt. Diese Position ist um xState.length() + der Anzahl der auf das letzte erkannte Token folgenden auszulassenden Zeichen größer als xState.LastPosition().
Wurde zuletzt ein SKIP-Token erkannt, so sind Position und NextPosition identisch. Die Leerzeichen am Ende des durch SKIP abgedeckten Textes können mit trim_right_copy entfernt werden.
void SetPosition(unsigned int xi );
Mit SetPosition kann die aktuelle Position als Anzahl von Zeichen ab Textanfang direkt gesetzt werden. In Folge dieser Methode wird das nächste Token mit dem aktuellen Scanner neu ermittelt. Dies kann z.B. nützlich sein, wenn der Text Metainformationen über die Längen seiner Bestandteile enthält.
bool IsSubCall() const
gibt true zurück, wenn gerade eine Produktion ausgeführt wird, die vom Interpreter aus aufgerufen wurde. Hier wird eine temporäre Parser-Zustandsvariable xState verwendet (i.G. zum Plugin). Innerhalb der Produktionen des Haupt-Parsers gibt diese Funktion false zurück.
str ProductionName() const
gibt den Namen der aktuellen Produktion zurück.
Der Rückgabetyp ist stets std::string, auch bei der Erzeugung von Unicode-Parsern.
Diese Funktion ist nicht thread-sicher.
str BranchName() const
gibt den Namen des letzten Verweigung (Alternative, Option etc.) zurück
Der Rückgabetyp ist stets std::string, auch bei der Erzeugung von Unicode-Parsern.
Diese Funktion ist nicht thread-sicher.
---------------------------------------------------------------------------
int itg() const int itg(int sub) const double dbl() const double dbl(int sub) const
Die Funktionen itg und dbl konvertieren den Text des zuletzt erkannten Tokens unmittelbar in einen Integer- bzw. einen double-Wert. Die itg-Funktion konvertiert auch Textabschnitte, die als Oktal- oder Hexadezimalzahlen interpretiert werden können.
----------------------------------------------------------------------------
str lp_str() const str lp_copy() const str lp_str(int sub) const unsigned int lp_length(int sub = 0) const
Diese Methode betreffen den Textabschnitt, der vom letzten Aufruf einer Produktion erkannt wurde ("lp" steht für "last production"). lp_str gibt diesen Abschnitt ohne die anfänglichen auszulassenden Zeichen zurück, während lp_copy den gesamten Abschnitt liefert. Die Methoden lp_str(int sub) und lp_length(int sub) sind formal äquivalent zu den Methoden str(int sub) und length(int sub). Jedoch können sie nur mit den Indizes -1 und 0 aufgerufen werden. Ist der Index == -1 so erhält man die Information über den ausgelassenen Text am Anfang der der Produktion.
Beispiel:
Prod1 ::= Prod3 Prod2 {{cout << xState.lp_copy(); }} Prod2 ::= {{cout << xState.lp_copy(); }} Prod1+ Prod3 ::= ID
Input ::= a b c Output ::= a b c
Prod3 in Prod1 erkennt "a", dass dann in Prod2 ausgegeben wird. Prod2 erkennt dann " b c", was am Ende von Prod1 ausgegeben wird.
----------------------------------------------------------------------------
str la_str() const str la_copy() const str la_str(int sub) const unsigned int la_length(int sub = 0) const
Diese Methode betreffen den Textabschnitt, der vom letzten Aufruf eines Vorausschau-Parsers erkannt wurde ("la" steht für "look ahead").. la_str gibt diesen Abschnitt ohne die anfänglichen auszulassenden Zeichen zurück, während la_copy den gesamten Abschnitt liefert. Die Methoden la_str(int sub) und la_length(int sub) sind formal äquivalent zu den Methoden str(int sub) und length(int sub). Jedoch können sie nur mit den Indizes -1 und 0 aufgerufen werden. Ist der Index == -1 so erhält man die Information über den ausgelassenen Text am Anfang der Vorausschau.
----------------------------------------------------------------------------
unsigned int next_size() const unsigned int next_length(int sub = 0) const stri next_str(int sub) const str next_str() const str next_copy() const
Diese Gruppe von Funktionen sind analog zu den Funktionen, deren Namen nicht mit "next_" beginnen. Sie liefern die entsprechenden Werte für das als nächstes erwartete Token. Im Laufe der Entwicklung des TextTransformers hat sich der Zeitpunkt, zu dem das nächste Token ermittelt wird geändert und es ist nicht völlig auszuschließen, dass sich nochmals Änderungen ergeben könnten. Diese Funktionen sind daher nur unter Vorbehalt zu verwenden.
----------------------------------------------------------------------------
int GetState() void SetState(int xeState);
Eine mit einer Reihe von Integerwerten wird der Zustand des Parserzustands gekennzeichnet.
typedef enum { epCleared, epExpectingToken, epExpectingSKIP, epExpectingBreak, epExpectingEOF, epNoProgress, epStopped, epExpectationError, epUnexpectedError, epSkipMatchedNeatless, epUnknownError, epParsedIncomplete, epUnknown } EPState;
Erfahrene Anwender können diese Werte u.U. in OnParseError manipulieren, um Fehler auszubügeln.
|
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |