Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Parser - einfache Mathematische Formel (https://www.delphipraxis.net/186844-parser-einfache-mathematische-formel.html)

ford42 6. Okt 2015 11:52

Delphi-Version: XE3

Parser - einfache Mathematische Formel
 
Hey,
ich versuche zur Zeit einen Parser für eine einfache Mathematische Formel (z.B: 2*4/3+5-4) zu schreiben, aber wenn ich z. B. 1*6*5 eingebe kommt 6 raus und nicht 30. :/

Weiß jemand wo ich den Fehler habe und hat vlt noch andere Verbesserungsvorschläge für den Parser? :)

Delphi-Quellcode:
unit Logic;

interface

uses
  System.Classes, System.SysUtils, StrUtils;

type
  TBerechnung = class
  private
    { Private-Deklarationen }
    m_EingabeZahl: TStringList;
    m_EingabeEreignis: String;
    m_EingabeRechenoperator: String;
  public
    { Public-Deklarationen }
    procedure AddZahl(p_Parameter: String);
    procedure AddEreignis(p_Parameter: String);
    procedure PosExRechnen(m_EingabeZahl: TStringList);
    function GetErgebnis(): String;
    procedure Erstelle;
    procedure Loesche;
    procedure Parser(zwErgebnis: String; zErgebnis: Double; i: Smallint; opFolge: Integer);
  end;

implementation

  procedure TBerechnung.Erstelle;
  begin
    m_EingabeZahl := TStringList.Create;
  end;

  procedure TBerechnung.Loesche;
  begin
    m_EingabeZahl.Free;
  end;

  procedure TBerechnung.AddZahl(p_Parameter: String);
  begin
    m_EingabeZahl.Add(p_Parameter);
  end;

  procedure TBerechnung.AddEreignis(p_Parameter: String);
  begin
    if p_Parameter = 'C' then
    begin
      m_EingabeZahl.Clear;
      m_EingabeEreignis := '';
      m_EingabeRechenoperator := '';
    end;
    //Parser
    if p_Parameter = '=' then
    begin
      PosExRechnen(m_EingabeZahl);
    end;
  end;

  procedure TBerechnung.Parser(zwErgebnis: String; zErgebnis: Double; i, opFolge: Integer);
  begin
    zwErgebnis := FloatToStr(zErgebnis);
    m_EingabeZahl.Delete(i);
    m_EingabeZahl.Delete(i);
    m_EingabeZahl[i - 1] := zwErgebnis;
    i := i - 2;                           //schauen, warum i nicht verändert
    if i = m_EingabeZahl.Count - 1 then
    begin
      opFolge := opFolge + 1;
    end;
  end;

  procedure TBerechnung.PosExRechnen(m_EingabeZahl: TStringList);
  var
    opFolge, arPos: Integer;
    i: Smallint;
    zErgebnis: Double;
    zwErgebnis: String;
    rOp: String;
  begin
    i := -1;
    opFolge := 1;
    while (i < m_EingabeZahl.Count - 1) do        //Nacheinander (erst mal, dann durch,..)
    begin
      i := i + 1;
      rOp := m_EingabeZahl[i];
      if (opFolge = 1) and (rOp = '*') then
      begin
        zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) * StrToFloat(m_EingabeZahl[i + 1]));
        Parser(zwErgebnis, zErgebnis, i, opFolge);
      end
      else if (opFolge = 2) and (rOp = '/') then
      begin
        zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) / StrToFloat(m_EingabeZahl[i + 1]));
        Parser(zwErgebnis, zErgebnis, i, opFolge);
      end
      else if (opFolge = 3) and (rOp = '+') then
      begin
        zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) + StrToFloat(m_EingabeZahl[i + 1]));
        Parser(zwErgebnis, zErgebnis, i, opFolge);
      end
      else if (opFolge = 4) and (rOp = '-') then
      begin
        zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) - StrToFloat(m_EingabeZahl[i + 1]));
        Parser(zwErgebnis, zErgebnis, i, opFolge);
      end;
    end;
  end;

  function TBerechnung.GetErgebnis;
  begin
    result := m_EingabeZahl.Text;
  end;
end.
PS: Und wie in dem Kommi zu sehen müsste sich ja i da oben verändern, tut es aber nicht. Oo

Vielen Dank im Voraus
Grüße ford42 :)

noisy_master 6. Okt 2015 12:21

AW: Parser - einfache Mathematische Formel
 
Moin,

wenn du Werte von Parametern verändern möchtest müssen diese schon als var deklariert werden...

Dann kplappts auch mit dem i und dem zwErgebnis...

Jens01 6. Okt 2015 12:36

AW: Parser - einfache Mathematische Formel
 
einen einfachen Math-Parser gibt es nicht. Entweder ganz oder gar nicht.
siehe RPN

Bjoerk 6. Okt 2015 12:53

AW: Parser - einfache Mathematische Formel
 
Hier hab ich (unter # 37) mal einen 08/15 Parser gepostet.

baumina 6. Okt 2015 13:01

AW: Parser - einfache Mathematische Formel
 
Sicher geht es hier hauptsächlich darum das Programmieren zu erlernen, nicht das Kopieren. Wenn eine procedure oder function eine ihr übergebene Variable mit verändertem Wert wieder zurückgeben soll, muss das Wort "var" davor. Beispiel

Delphi-Quellcode:
procedure TuWas(var Zahl : Integer);

Rollo62 6. Okt 2015 18:26

AW: Parser - einfache Mathematische Formel
 
Du suchst so etwas ?

Es gibt auch in den Fmx Libraries einen Evaluator, ich finde den nicht auf die Schnelle,
aber wenn du Fmx benutzt (und sehr wahrscheinlich funktionierts auch unter Vcl) dann solltest du mal
danach suchen.

Rollo

Dejan Vu 6. Okt 2015 19:06

AW: Parser - einfache Mathematische Formel
 
Zitat:

Zitat von Jens01 (Beitrag 1317773)
einen einfachen Math-Parser gibt es nicht. Entweder ganz oder gar nicht.

Doch. Hier.

Rollo62 8. Okt 2015 15:34

AW: Parser - einfache Mathematische Formel
 
Das hier meinte ich.

Alles schon im Paket enthalten :-)

Rollo

Stevie 8. Okt 2015 17:04

AW: Parser - einfache Mathematische Formel
 
Geht mit DelphiWebScript kinderleicht:

Delphi-Quellcode:
program MathExample;

{$APPTYPE CONSOLE}

uses
  dwsComp,
  dwsExprs;

var
  s: string;
  compiler: TDelphiWebScript;
  prog: IdwsProgram;
  exec: IdwsProgramExecution;
begin
  compiler := TDelphiWebScript.Create(nil);
  try
    repeat
      Readln(s);
      if s = '' then Exit;
      prog := compiler.Compile('Print(' + s + ')');
      if prog.Msgs.HasErrors then
        Writeln(prog.Msgs.AsInfo)
      else
      begin
        exec := prog.Execute;
        Writeln(exec.Result.ToString);
      end;
    until False;
  finally
    compiler.Free;
  end;
end.
LOL @LiveBindings Lösung...

Dejan Vu 8. Okt 2015 20:31

AW: Parser - einfache Mathematische Formel
 
Boah. Da fällt mir ein: "Wenn man die Lösung hat, hat man das Problem fast gelöst".


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr.
Seite 1 von 2  1 2      

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