Newsgroup: it.comp.lang.delphi
Titolo: Richiesta...

Salve a tutti,
devo creare un parser di espressioni matematiche in Delphi,che gestisca
espressioni con parentesi,priorità dei segni... insomma,che risolva in
maniera corretta un'espressione matematica.
Sapete dove posso trovarne uno?
Altrimenti avete consigli per crearlo?
grazie a tutti
    Ryo Saeba
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Altrimenti avete consigli per crearlo?
Non conosco parser già pronti.
So che questi parser e le calcolatrici serie si rifanno ad una tecnica
particolare detta "Notazione Polacca Postfissa" che serve a serializzare le
operazioni.
Cercando su google dovresti ottenere risultati interessanti ...
Ciao!
--
- Carlo -
c.b...@libero.it

maniera corretta un'espressione matematica.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
const tkNULL   = #00;
      tkNUMBER = #01;
      tkPLUS   = '+';
      tkMINUS  = '-';
      tkMUL    = '*';
      tkDIV    = '/';
      tkLP     = '(';
      tkRP     = ')';
var
  CurrentToken: Char;
  NumberValue: Double;
  ExprStr: String;
procedure GenerateError(Msg: String);
begin
  raise Exception.Create(Msg);
end;
function Expression(GetFlag: Boolean): Double; forward;
procedure GetToken;
var
  NumStr: String;
begin
  if (ExprStr = '') then
    CurrentToken := tkNULL
  else
  if (ExprStr[1] in ['0'..'9']) then
  begin
    NumStr := '';
    while ((ExprStr <> '') and
           (ExprStr[1] in ['0'..'9'])) do
    begin
      NumStr := NumStr + ExprStr[1];
      Delete(ExprStr, 1, 1);
    end;
    NumberValue := StrToFloat(NumStr);
    CurrentToken := tkNUMBER;
  end
  else
  if (ExprStr[1] in ['+', '-', '*', '/', '(', ')']) then
  begin
    case ExprStr[1] of
       '+' : CurrentToken := tkPLUS;
       '-' : CurrentToken := tkMINUS;
       '*' : CurrentToken := tkMUL;
       '/' : CurrentToken := tkDIV;
       '(' : CurrentToken := tkLP;
       ')' : CurrentToken := tkRP;
    end;
    Delete(ExprStr, 1, 1);
  end
  else
    CurrentToken := tkNULL;
end;
function Prim(GetFlag: Boolean): Double;
var
  V: Double;
begin
  if (GetFlag) then GetToken;
  case CurrentToken of
    tkNUMBER : begin
                 V := NumberValue;
                 GetToken;
                 Result := V;
                 Exit;
               end;
    tkMINUS  : begin
                 Result := -Prim(True);
               end;
    tkLP     : begin
                 V := Expression(True);
                 if (CurrentToken <> tkRP) then
                   GenerateError('Errore: attesa )');
                 GetToken;
                 Result := V;
                 Exit;
               end;
  else
    GenerateError('Errore di sintassi!');
  end
end;
function Term(GetFlag: Boolean): Double;
var
  D, Left: Double;
begin
  Left := Prim(GetFlag);
  while (True) do
  begin
    case CurrentToken of
      tkMUL : Left := Left * Prim(True);
      tkDIV : begin
                D := Prim(True);
                if (D = 0) then
                  GenerateError('Divisione per zero!');
                Left := Left / D;
              end;
    else
      begin
        Result := Left;
        Exit
      end
    end
  end
end;
function Expression(GetFlag: Boolean): Double;
var
  Left: Double;
begin
  Left := Term(GetFlag);
  while (True) do
  begin
    case (CurrentToken) of
      tkPLUS  : Left := Left + Term(True);
      tkMINUS : Left := Left - Term(True);
    else
      begin
        Result := Left;
        Exit;
      end
    end
  end
end;
function NoSpaces(S: String): String;
var
  I: Integer;
begin
  Result := '';
  for I := 1 to Length(S) do
  begin
    if S[I] <> ' ' then
    begin
      Result := Result + S[I];
    end;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ExprStr := NoSpaces(Edit1.Text);
  Edit2.Text := FloatToStr(Expression(True));
end;
end.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

operazioni.
La notazione polacca postfissa non credo sia *seriamente*
utilizzata da alcun parser di questo tipo.  Per scopi
didattici va bene, ma tecniche migliori, e alternative tra
loro, vanno dalla ricorsione discendente (vedi mio codice)
allo shift/reduce.


 allo shift/reduce.
Con le nozioni attuali non mi sento di ribattere, dovrei documentarmi
meglio.


dovrei documentarmi meglio.
Fidati.


 maniera corretta un'espressione matematica.
Math Expression Parsers/Evaluators
http://www.crbond.com/parsers.htm
Ciao.