Fórum Validar uma expressão aritmética #340046

08/04/2007

0

Olá Senhores,

alguém sabe como posso validar uma expressão aritmérica?

exemplo:

tenho um edit e um botão.

no edit irei colocar:

2+(1+1)

quero validar se a sintaxe da expressão esta correta.

exemplos:

2+{2+[1+1+(6/3)]}
esta correta

mas
2+{2+[1+1+(6/3)}]
esta errada. e assim por diante.


obrigado. :)


Otto

Otto

Responder

Posts

08/04/2007

Catunda

Uma sugestão seria vc tratar em uma instrução sql.

´select ´+edit1.text+´ from rdb$database´

executar essa instrução e tratar o erro. se não retornar nenhum erro então é válida.


Responder

Gostei + 0

09/04/2007

Otto

Olá, a idéia é boa, mas, a aplicação nao terá acesso a nenhuma base de dados, e sim validação na mao mesmo.. eu to quase conseguindo... assim que conseguir eu posto aqui pra turma :P

valeeu


Responder

Gostei + 0

10/04/2007

Marco Salles

talves possa lhe ser util.

se encontrar algum erro , post por favor.

function testarExpressao(texto:String):Boolean;
Const
tipo: Array[1..6] of Char =  (´{´,´[´,´(´,´)´,´]´,´}´);

procedure interno(var i:integer;a,b,c,d,e,f:integer);
  var
   Aux:String;
   posini,posFim,Primeiro:integer;
   begin
     posIni:=i;
       While posIni  > 0 Do
         begin
           primeiro:=posini;
           posini:=PosEx(tipo[a],texto,posIni+1);
         end;
       posFim:=posEx(Tipo[b],texto,primeiro);
       Aux:=Copy(texto,primeiro,posfim-primeiro);
         if (pos(Tipo[c],Aux)>0)or(pos(Tipo[d],Aux)>0)or
            (pos(Tipo[e],Aux)>0)or(pos(Tipo[f],Aux)>0)then
            begin
              abort;
            end
         else
           if posFim > primeiro Then
             begin
               Delete(texto,primeiro,1);
               Delete(Texto,posfim-1,1);
               i:=i-1;
             end;
     end;
procedure Localizar(a,b:integer);
 begin
   if (pos(Tipo[a],texto) > 0)or(pos(Tipo[b],texto) > 0) then
      abort;
 end;
var
i:integer;
resultado:Boolean;
begin
try
  result:=false;

  for I:=1 to length(texto) do
    if not (texto[i] in [´{´,´[´,´(´,´)´,´]´,´}´]) then
      delete(texto,i,1);
  i:=1;
   while i <= length(texto) do
    begin
       case texto[i] of
       ´(´:interno(i,3,4,1,2,5,6)
       end;
     i:=i+1;
    end;
  localizar(3,4);
      i:=1;
       while i <= length(texto) do
         begin
           case texto[i] of
             ´[´: begin
                   interno(i,2,5,1,6,1,6)
                 end;
             end;
           i:=i+1;
         end;
  localizar(2,5);
   i:=1;
   while i <= length(texto) do
    begin
      interno(i,1,6,2,3,4,5);
      i:=i+1;
   end;
  localizar(1,6);
//exceção silenciosa
except
   on e:Eabort do
       result:=True;
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if testarExpressao(edit1.Text) then
   showmessage(´tem erro´)
else
  showmessage(´não tem erro´);
end;



Responder

Gostei + 0

10/04/2007

Marco Salles

talves possa lhe ser util.

se encontrar algum erro , post por favor.

function testarExpressao(texto:String):Boolean;
Const
tipo: Array[1..6] of Char =  (´{´,´[´,´(´,´)´,´]´,´}´);

procedure interno(var i:integer;a,b,c,d,e,f:integer);
  var
   Aux:String;
   posini,posFim,Primeiro:integer;
   begin
     posIni:=i;
       While posIni  > 0 Do
         begin
           primeiro:=posini;
           posini:=PosEx(tipo[a],texto,posIni+1);
         end;
       posFim:=posEx(Tipo[b],texto,primeiro);
       Aux:=Copy(texto,primeiro,posfim-primeiro);
         if (pos(Tipo[c],Aux)>0)or(pos(Tipo[d],Aux)>0)or
            (pos(Tipo[e],Aux)>0)or(pos(Tipo[f],Aux)>0)then
            begin
              abort;
            end
         else
           if posFim > primeiro Then
             begin
               Delete(texto,primeiro,1);
               Delete(Texto,posfim-1,1);
               i:=i-1;
             end;
     end;
procedure Localizar(a,b:integer);
 begin
   if (pos(Tipo[a],texto) > 0)or(pos(Tipo[b],texto) > 0) then
      abort;
 end;
var
i:integer;
resultado:Boolean;
begin
try
  result:=false;

  for I:=1 to length(texto) do
    if not (texto[i] in [´{´,´[´,´(´,´)´,´]´,´}´]) then
      delete(texto,i,1);
  i:=1;
   while i <= length(texto) do
    begin
       case texto[i] of
       ´(´:interno(i,3,4,1,2,5,6)
       end;
     i:=i+1;
    end;
  localizar(3,4);
      i:=1;
       while i <= length(texto) do
         begin
           case texto[i] of
             ´[´: begin
                   interno(i,2,5,1,6,1,6)
                 end;
             end;
           i:=i+1;
         end;
  localizar(2,5);
   i:=1;
   while i <= length(texto) do
    begin
      interno(i,1,6,2,3,4,5);
      i:=i+1;
   end;
  localizar(1,6);
//exceção silenciosa
except
   on e:Eabort do
       result:=True;
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if testarExpressao(edit1.Text) then
   showmessage(´tem erro´)
else
  showmessage(´não tem erro´);
end;



Responder

Gostei + 0

10/04/2007

Dmenin

tem um componente q faz isso..eh Parser o nome do dpk...mas n lembro onde que achei ele...acho q ainda tenho se vc quiser...

PS: vc eh o oto q participava da lista de delphi da UOL há uns 3 anos?


Responder

Gostei + 0

10/04/2007

Marco Salles

tem um componente q faz isso..eh Parser o nome do dpk...mas n lembro onde que achei ele...acho q ainda tenho se vc quiser...


biblioteca JVCL tem tb. mas fazer e acontecer é mais gostoso :wink:


Responder

Gostei + 0

10/04/2007

Dmenin

vai programa em java entao :p


Responder

Gostei + 0

13/04/2007

Otto

Marco,mto obrigado pela resposta.. ajudou mto..

abraço


Responder

Gostei + 0

13/04/2007

Marco Salles

Marco,mto obrigado pela resposta.. ajudou mto.. abraço


fico muito feliz que tenha gostado...

confesso que levei horas para desenvolver

mas o final é gratificante....


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar