Vorausschau

Top  Previous  Next

Skripte > Klassen-Elemente und C++-Befehle > Aufruf einer Produktion > Vorausschau

 

Produktionen können aus dem Interpreter heraus aufgerufen werden, um zu testen, ob der Eingabetext ab der aktuellen Position zur Produktion passt. In Kombination mit dem IF-Symbol oder WHILE ist es so möglich Texte zu parsen, deren Strukturen sich nicht, oder nur schwer, LL(1)-konform beschreiben lassen.

Bei dieser Vorausschau (look ahead) wird die aktuelle Position nicht geändert und der semantische Code der Produktion wird nicht ausgeführt. Eine Parameterübergabe ist daher nicht nötig. Vielmehr erkennt der TextTransformer einen Aufruf zur Vorausschau gerade daran, dass der Produktion keine Parameter übergeben werden, im Unterschied zum Aufruf eines Unter-Parsers, der mindestens einen String-Parameter benötigt.

Der Text wird nur soweit getestet bis entweder ein Token erwartet wird, dass in ihm nicht vorkommt oder bis das letzte Symbol der Produktion erkannt wird. So gibt eine Vorausschau einen bool-Wert zurück, der true ist, wenn der Text zur Produktion passt und false, wenn sie nicht passt. Es werden keine Ausnahmen ausgeworfen.

Eine Vorausschau kann selbst von anderen Vorausschau-Produktionen abhängen, die in ihr getestet werden. Die verschiedenen Ebenen der Vorausschau werden als Nummer sowohl in einem gesonderten Feld der Werkzeugleiste als auch als vorangestellte Nummer im Stackfenster dargestellt.

 

Der von der Vorausschau erkannte Text kann über die Parserzustands-Methode la_str() erhalten werden, z.B. um ihn einem Unter-Parser zu übergeben.

 

 

Ein ausführliches Beispiel ist der Java-Parser.

 

 

Das Ergebnis der Vorausschau hängt davon ab, ob die Vorausschau-Produktion zu dem System gehört, in dem sei aufgerufen wird oder nicht.

 

Die Produktion Ident wird im gleichen Parser-System verwendet in dem sie auch als Vorausschau-Produktion verwendet wird. Die Eingabe "int" ergibt so das erwartete Resultat: "int gefunden", wenn die Option zum Testen aller Literale aktiviert ist.

 

 

IF(!Ident())

"int" {{cout << "int gefunden"; }}

ELSE  

Ident  {{cout << "Fehler"; }}

END

 

Ident ::= IDENT

IDENT ::= \w+

 

Wird hingegen eine externe Produktion zur Vorausschau verwendet:

 

isIdent ::= IDENT

 

IF(!isIdent())

"int" {{cout << "int gefunden"; }}

ELSE  

IDENT  {{cout << "Fehler"; }}

END

 

ergibt die Eingabe "int" den Fehler: "IDENT" erwartet. Da isIdent eine Startproduktion ist, die im Hauptparser nicht verwendet wird, kennt sie auch nicht dessen Token. "int" wird in ihr also als IDENT interpretiert  und !isIdent() ist falsch.  Damit wir die ELSE-Alternative gewählt. Im Hauptsystem wurde "int" aber als int erkannt, was dann aber von IDENT nicht akzeptiert wird.

 

In anderen Fällen ist es von Vorteil eine externe Produktion für die Vorausschau zu verwenden. So wird SKIP im nächsten Beispiel das Satzende-Zeichen finden, auch wenn der Satz mit "Was" oder "Wie" beginnt.

 

isQuestion ::=

SKIP

(

   "?"

| ( "." | "!" )

    EXIT

)

 

Sentence ::=

IF(isQuestion())

Question

ELSE

NonQuestion

END   

 

Question ::=

(

   "Was" {{ out << "Das solltest du besser wissen als ich!"; }}

| "Wie"  {{ out << "Ich weiß nicht wie!"; }}

)

| {{ out << "Ich verstehe deine Frage nicht!"; }}

IDENT+ "?"

 

NonQuestion ::=

IDENT+ ( "." | "!" )

{{

out << "Das klingt interessant!";

}}

 

 

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English