- 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.
- Verwendung
- Die Klasse TParser benötigt einen TFileStream, einen TStringStream oder einen TMemoryStream.
- Beispiel
/*
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;
}
}
}