Unter-Parser

Top  Previous  Next

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

 

Eine Produktion kann direkt aus dem Interpreter-Code aufgerufen werden. Sie gehört dann nicht zur eigentlichen Grammatik des Parsers, in den dieser Interpreter-Code eingebettet ist. Die aufgerufene Produktion ist vielmehr eine Startregel für einen gesonderten Parser und diesem wird ein neuer Eingabetext explizit übergeben. Die Übergabe eines String-Parameters unterscheidet den Aufruf eines Unter-Parsers von einem Aufruf zur Vorausschau.

 

Unter-Parser können z.B. Parameter aus einem Text extrahieren, der von einem Vorausschau-Parser erkannt wurde, bevor mit dem eigentlichen Parsen fortgesetzt wird.

 

IF( Production() ) // Vorausschau-Parser

{{ Parameters( xState.la_str() ); // Unter-Parser }}

Production // Haupt-Parser

END

 

 

Andere Anwendungsbeispiele für Unter-Parser sind die Behandlung von Include-Dateien oder das Einlesen von externen Daten in das Programm.

Soll z.B. die Produktion mit dem Namen Include aufgerufen werden, so könnte dies folgendermaßen geschehen.

 

 

{{

str buf;

str sIncludeFile = xState.SourceRoot() + "\\" + xState.str( 1 );

 

if( load_file(buf, sIncludeFile ) )

Include(buf);

else

  throw CTT_Error( sIncludeFile + " could not be opened");

}}

 

 

Eventuelle Parameter der Include-Produktion werden an den String für den neuen Quelltext angehängt.

 

 

Um bereits vor Beginn des Parsens die Anzahl der zu parsenden Zeilen zu ermitteln, kann der Unterparser CountLines verwendet werden:

 

CountLines(int& xi) ::=

(

SKIP EOL

{{ xi++; }}

)+

 

Aufzurufen wäre CountLines in einer Aktion, die ausgeführt wird, bevor das erste Token des Hauptparsers erkannt wurde:

 

{{

int iLines = 0;

CountLines(xState.str(-2), iLines);

}}

 

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English