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 |