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

Dovrei realizzare un programmino che
di volta in volta usa formule diverse che
vorrei memorizzare in un file separato.
Dato che alcune hanno anche un
IF Then ecc ecc, mi servirebbe qualcosa
che interpreta la formula e la esegue nel programma
Avete qualche idea o qualcuno utilizza un parser?
Su torry ce ne sono tanti, ma a me servirebbe free..
Continuo la ricerca.............
Ciao!

 Avete qualche idea o qualcuno utilizza un parser?
Io ne ho scritto uno che ho pubblicato qui un po' di
tempo fa.  Non e' complicato estenderlo per gestire
una grammatica piu' complessa.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Me lo posteresti?
   Ciao


    Ciao
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.



wrote:
Non sono sicuro che tu stia chiedendo questo, ma...
http://www.dwscript.com
Qui trovi un  interprete pascal. 
Integrato nell'ide come collezione di componenti, free,
con sorgenti ed esempi di funzionamento.
Non so se risolva i tuoi problemi, ma ho provato uno dei programmi di
esempio e riesce ad eseguire un quick-sort interpretato.


 ha scritto nel messaggio
news:j6f5eu4nnj7oodn8m...@4ax.com...
