Einzelnen Beitrag anzeigen

Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Suche Lösungsansatz zum Verbessern des Parsen von Funkti

  Alt 11. Apr 2009, 11:44
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat