![]() |
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? |
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.
![]() ![]() Grüße vom marabu |
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:
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.
Function GetNextToken : TToken;
Var aToken : String; Begin Result.Token := ExtractNextTokenFromInput; Result.TokenClass := FindTokenClass (Result.Token); End;
Delphi-Quellcode:
Ich hoffe, das hilft.
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; 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. |
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