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