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.