Zitat von
SimStar001:
Nun wäre meine Frage, ob es nicht irgendwie möglich ist, die Funktion nach dem Prinzip zu parsen, jedoch die einzellnen Teile irgendwie gespeichert werden können, um nacher bei der Funktionswertberechnung, die Funktion nicht jedesal einlesen zu müssen, sondern sofort mit dem Rückrechnen begonnen werden kann.
Exakt. Statt sofort auszurechnen, musst Du beim Parsen einen
AST erstellen. Könnte im Design z.B. so aussehen:
Delphi-Quellcode:
type
TOp = class
function Evaluate: Float; virtual; abstract;
end;
TBinaryOpKind = (bokPlus, bokMinus, bokMul, bokDiv);
TBinaryOp = class(TOp)
constructor Create(aKind : TBinaryOpKind; aLeft : TOp; aRight : TOp);
function Evaluate: Float; override;
end;
TUnaryOp = class(TOp) [...] // Minus, ggf. sin, Fakultät etc.
TVariableOp = class(TOp) // Literale("3.14"), Konstanten und Variablen
constructor Create(aVar : TVar);
function Evaluate: Float; override;
end;
[...]
function TBinaryOp.Evaluate : Float;
begin
case fKind of
bokPlus : Result := fLeft.Evaluate + fRight.Evaluate;
...
end;
function TVariableOp.Evaluate : Float;
begin
Result := fVar.Value;
end;
Ich hoffe, ich konnte das Konzept klar machen
.
Einen Schritt weiter wären wir dann bei kompilierenden Parsern, da könntest du dich von Dax
inspirieren lassen.