Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Text auf reservierte Schlüsselwörter untersuchen (https://www.delphipraxis.net/45939-text-auf-reservierte-schluesselwoerter-untersuchen.html)

Pseudemys Nelsoni 15. Mai 2005 07:07


Text auf reservierte Schlüsselwörter untersuchen
 
Moin,

ich habe vor eine kleine Scriptsprache in meinem Programm einzubauen, das Parsen sollte kein Problem darstellen. Wie sieht es aber aus mit dem Suchen nach Schlüsselwörtern? Muss ich jedes Wort des Textes mit einer (internen) Commandliste prüfen oder wie? Könnte mir vorstellen das das ne langsame Methode ist.

Jermand ne andere Idee?

marabu 15. Mai 2005 07:33

Re: Text auf reservierte Schlüsselwörter untersuchen
 
Wenn es dir nur um das Einbauen geht, dann kannst du auf fertige engines zurückgreifen, z.B. Pascal Script von Carlo Kok (RemObjects) oder oPascalScript von Felix Deschamps.

Grüße vom marabu

alzaimar 15. Mai 2005 07:39

Re: Text auf reservierte Schlüsselwörter untersuchen
 
Was Du benötigst, ist ein sog. 'Tokenizer', der einen 'Input' in seine Bestandteile (die 'Token') zerlegst. Ein Token ist z.B.:
- Eine Zahl
- Ein String
- Ein Operator
- Ein Schlüsselwort (if, then, else, procedure etc.)
- Ein ungültiges Zeichen
- Ein Kommandotrennzeichen (bei Delphi: #13 oder ';')
...
Das sind die Tokenklassen. Innerhalb des Tokenizers gibt es eine Funktion, die zu einem Token die dazugehörige Tokenklasse herausfindet.
Die Funktion "GetNextToken : TToken" sieht also z.B. so aus:
Delphi-Quellcode:
Function GetNextToken : TToken;
Var
  aToken : String;

Begin
  Result.Token := ExtractNextTokenFromInput;
  Result.TokenClass := FindTokenClass (Result.Token);
End;
Wobei ExtractNextTokenFromInput, wie der Name schon sagt, aus dem Input das nächste 'Wort' extrahiert. Die Tokenklasse ist z.B. ein ordinaler Typ, mit dem Du im eigentlichen Interpreter in der Hauptschleife eine Case-Anweisung erzeugst, die optimale Performance sicherstellt. Hier mal Pseudocode, der einen 'Begin ... End;' Block interpretiert.
Delphi-Quellcode:
Procedure ProcessBlockStmt;
Var
  aToken : TToken;
  aDone : Boolean;

Begin
  aDone := False;
  Repeat
    aToken := GetNextToken; // Könnte auch direkt ins 'Case', aber vielleicht braucht man das aToken.Token
    Case aToken.Result of
      tcBegin :
        ProcessBlockStmtn;
      tcIf :
        ProcessIfStatement;
      tcWhile :
        ProcessWhileToken;
      tcFor :
        ProcessForToken;
      tcIdentifier :
        ProcessAssignment;
      tcEnd :
        aDone := True;
      Else
        Raise EParseException.Create (ecInvalidTokenClass, aToken);
      end;
  Until aDone;
End;
Ich hoffe, das hilft.

Versuch mal DWS (Delphi Web Script). Gibt es bei Sourceforge.Net. Der Pascal-Interpreter von Carlo-Cok ist (zumindest in der Version von vor 2 Jahren) grauselig.

Pseudemys Nelsoni 15. Mai 2005 07:56

Re: Text auf reservierte Schlüsselwörter untersuchen
 
Moin,

danke für die ausführlichen Antworten ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz