Validar uma expressão aritmética
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. :)
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
Curtidas 0
Respostas
Catunda
08/04/2007
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.
´select ´+edit1.text+´ from rdb$database´
executar essa instrução e tratar o erro. se não retornar nenhum erro então é válida.
GOSTEI 0
Otto
08/04/2007
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
valeeu
GOSTEI 0
Marco Salles
08/04/2007
talves possa lhe ser util.
se encontrar algum erro , post por favor.
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;
GOSTEI 0
Marco Salles
08/04/2007
talves possa lhe ser util.
se encontrar algum erro , post por favor.
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;
GOSTEI 0
Dmenin
08/04/2007
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?
PS: vc eh o oto q participava da lista de delphi da UOL há uns 3 anos?
GOSTEI 0
Marco Salles
08/04/2007
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:
GOSTEI 0
Dmenin
08/04/2007
vai programa em java entao :p
GOSTEI 0
Otto
08/04/2007
Marco,mto obrigado pela resposta.. ajudou mto..
abraço
abraço
GOSTEI 0
Marco Salles
08/04/2007
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....
GOSTEI 0