Die Klasse TParser

  1. Einleitung
    • In den Dateien Classes.pas und Classes.hpp findet man eine undokumentierte Klasse namens TParser vor. Diese kann benutzt werden, um Text zu parsen. Hierbei dienen Leerzeichen, Tabs, Doublequotes oder Leerzeilen als Trennzeichen zwischen den einzelnen Tokens. Ein Token kann z.B. ein String oder eine Zahl (int, float, hex) sein.
  2. Verwendung
    • Die Klasse TParser benötigt einen TFileStream, einen TStringStream oder einen TMemoryStream.
  3. Beispiel
  4. /*
    char Token (read-only) gibt den Token-Typ zurück (toEOF, toSymbol, toString, toInteger, toFloat, toWString)
    int SourceLine (read-only) gibt die Zeilennummer die das Token enthält zurück
    int SourcePos() gibt die Position des Tokens im Stream zurück
    char NextToken() gibt den Typ des nächsten Tokens zurück
    Extended TokenFloat() gibt ein Token zurück und konvertiert ihn zu Extended
    int TokenInt() gibt ein Token zurück und konvertiert ihn zu int
    AnsiString TokenString() gibt ein Token zurück und konvertiert ihn zu AnsiString
    WideString TokenWideString() gibt ein Token zurück und konvertiert ihn zu WideString
    */
    
    // Eingabe: Textdatei
    // Ausgabe: Memofeld (Memo1)
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        if (OpenDialog1->Execute())
        {
            TFileStream *F = new TFileStream(OpenDialog1->FileName, fmOpenRead);
            TParser *Parser = new TParser(F);
    
            while (Parser->Token != toEOF)
            {
                //Token holen
                AnsiString sTokenString = Parser->TokenString();
    
                //Streamposition holen
                int iPosition = Parser->SourcePos();
    
                //Zeilennummer holen
                int iZeile = Parser->SourceLine;
    
                //TokenTyp bestimmen
                char cTokenType = Parser->Token;
    
                AnsiString sAusgabe = sTokenString+" ist ein ";
    
                switch(cTokenType)
                {
                    case toSymbol : sAusgabe = sAusgabe + "Symbol"; break;
                    case toInteger: sAusgabe = sAusgabe + "Integer"; break;
                    case toFloat : sAusgabe = sAusgabe + "Float"; break;
                    case toString : sAusgabe = sAusgabe + "String"; break;
                    default : sAusgabe = sAusgabe + "Zeichen";
                }
    
                Memo1->Lines->Add(sAusgabe + " gefunden in Zeile: "+IntToStr(iZeile)+", Position: "+IntToStr(iPosition));
    
                Parser->NextToken();
            }
    
            if (Parser)
            {
                delete Parser;
                Parser = NULL;
            }
    
            if (F)
            {
                delete F;
                F = NULL;
            }
        }
    }