Analizadore de expresiones

18/02/2007 - 13:39 por Hugo Gsell | Informe spam
Necesito un analizador de expresiones algebraicas no un 'resolvedor' (
si existe el término jeje).
Es decir, necesito evaluar si una expresión es sintacticamente válida... no
resolverla sino simplemente evaluar su sintaxis.

Las expresiones pueden ser algo como y necesito saber si es válida... esta
creo que no lo es jeje.

x + Sin(y-1) / (((Cos(z+4) ^ 2 * sqr (w))

Hugo A. Gsell

Preguntas similare

Leer las respuestas

#1 Sergio E.
18/02/2007 - 21:20 | Informe spam
Hola, lo unico que se me ocurre aqui de momento es recordar mis viejas
clases de compiladores, donde en alguna de las practicas generamos un
compilador que procesa este tipo de expresiones, utilizando funciones para
definir lo que es un termino, una expresion, etc... donde a la funcion
principal le pasas como parametro la expresion a validar y se intenta
resolverla..., arrojando una excepcion si algo no anda bien...
Si te interesa implementar algo asi, mandame un mensaje y te busco las
funciones esas...


Saludo
Sergio E.


"Hugo Gsell" escribió en el mensaje
news:
Necesito un analizador de expresiones algebraicas no un 'resolvedor'
( si existe el término jeje).
Es decir, necesito evaluar si una expresión es sintacticamente válida...
no resolverla sino simplemente evaluar su sintaxis.

Las expresiones pueden ser algo como y necesito saber si es válida... esta
creo que no lo es jeje.

x + Sin(y-1) / (((Cos(z+4) ^ 2 * sqr (w))

Hugo A. Gsell


Respuesta Responder a este mensaje
#2 Hugo Gsell
19/02/2007 - 11:34 | Informe spam
Hola. Si la verdad que estoy interesado en ese tema
En realidad tengo un evaluador de expresiones bajado de la red (creo que de
la pagina del Guille o por ahí) y funciona correctamente para lo que
necesito...
La cosa es que digamos... una cosa es analizar la valides de la rxpresión...
por ej x +((2 /y) donde, en este ejemplo le falta un parentesis... y otra es
que supongamos tenga la misma expresión (pero sintacticamente correcta)

x +((2 /y)) pero en este caso y como con alta probabilidad puede pasar en
las expresiones que deseo analizar y puede ser 0. Considerando esto y que
las funciones que puedo utilizar en este evaluador de expresiones son cerca
de 30... la verdad que NO SE SI PUEDO determinar cuales son todos los
posibles errores que puede arrojarme... para ir probando y decir bueno...
error división por 0, bueno error overflow, bueno etc etc.
ademas que valores aleatorios asignaría a una función como la siguiente y
con probabilidades de que no me de un error insalvable, capturable e
identificable.

x1 + ((x2^(x3/2)- sqrt(x4-y1*3)/(1/2)) * ((sin x1) + (cos c3/d4))...
nuevamente gracias.

Hugo Gsell


"Sergio E." <gruporemp[ARROBA]hotmail.com> escribió en el mensaje
news:
Hola, lo unico que se me ocurre aqui de momento es recordar mis viejas
clases de compiladores, donde en alguna de las practicas generamos un
compilador que procesa este tipo de expresiones, utilizando funciones para
definir lo que es un termino, una expresion, etc... donde a la funcion
principal le pasas como parametro la expresion a validar y se intenta
resolverla..., arrojando una excepcion si algo no anda bien...
Si te interesa implementar algo asi, mandame un mensaje y te busco las
funciones esas...


Saludo
Sergio E.


"Hugo Gsell" escribió en el mensaje
news:
Necesito un analizador de expresiones algebraicas no un 'resolvedor'
( si existe el término jeje).
Es decir, necesito evaluar si una expresión es sintacticamente válida...
no resolverla sino simplemente evaluar su sintaxis.

Las expresiones pueden ser algo como y necesito saber si es válida...
esta creo que no lo es jeje.

x + Sin(y-1) / (((Cos(z+4) ^ 2 * sqr (w))

Hugo A. Gsell






Respuesta Responder a este mensaje
#3 Sergio E.
20/02/2007 - 18:53 | Informe spam
Hola, perdon por la demora pero no encontraba mi programilla, mira esta
escrito en pseudo c++, pero segun yo es claro como lo hace...

El primer paso es analizar la cadena, simbolo por simbolo (carácter x
carácter) , es decir, recorrer la cadena y si encuentro algo como "alfa" al
encontrarme primero con la "a", sigo recorreindo la cadena hasta encontrar
el sigiuente simbolo, que puede ser un operador relacional, un operador de
adicion, de multiplicacion, etc.

Cuando se analiza una expresion, se inicia por esa funcion, expresion(), la
cual manda llamar a otras funciones que tratan de conceptos mas sencillos,
como expresion simple, que espera un termino y luego despues de procesar la
funcion termino, la cual analiza primero un factor y asi sucesivamente,
llamando a las otras funciones conforme se necesite.

/* Tokens lexicográficos y valores para operadores: */

#define RELOP 300 // operador relacional

#define LT 301 //<

#define LE 302 //<
#define EQ 303 //
#define GE 304 //>
#define GT 305 //>

#define NE 306 // !
#define ADDOP 400 // operador aditivo,
+, -

#define PLUS 401 // +

#define MINUS 402 // -

#define OR 403 // or

#define MULOP 500 // operador
multiplicativo, *,/

#define TIMES 501 // *

#define DIV 502 // -

#define MOD 503 // %

#define AND 504 // and







// Compara el tipo del ultimo simbolo preanalizado, verificando que
corresponda al tipo solicitado en su parametro

void parea(int se_espera)
{
if (preanalisis == se_espera)
{
preanalisis = lexico(); /*manda llamar al analizador lexico
para obtener el siguiente simbolo preanalizado y guardarlo en memoria */
}
else
{
err_espera = se_espera;
error(ERR_SINTAXIS);
err_espera = -2;
}
}





void expresion()
{
int iValorOp;



expr_simple();
if (preanalisis == RELOP) /*operador relacional, <,>,=,<=,>=*/
{
iValorOp = tokenval;
parea(RELOP);
expr_simple();
}
}



void expr_simple()
{
int iValorOp;



termino();
while (preanalisis == ADDOP)
{
iValorOp = tokenval;
parea(ADDOP);
termino();
}
}



void termino()
{
int iValorOp;



factor();
while (preanalisis == MULOP)
{
iValorOp = tokenval;
parea(MULOP);
termino();
}
}



void factor()
{
switch (preanalisis)
{
case '(':
parea('(');
expresion();
parea(')');
break;
case N_E_P_S_S: /*numero entero positivo sin
signo*/
parea(N_E_P_S_S);
break;
case ID:
parea(ID);
break;
}
}

Espero esto te sirva, tengo un archivo zip con los diagramas de este tipo de
analisis, pero no me fue posible enviarlo al grupo, si gustas te lo envio a
tu correo.

Saludos
Sergio E.



"Hugo Gsell" escribió en el mensaje
news:%
Hola. Si la verdad que estoy interesado en ese tema
En realidad tengo un evaluador de expresiones bajado de la red (creo que
de
la pagina del Guille o por ahí) y funciona correctamente para lo que
necesito...
La cosa es que digamos... una cosa es analizar la valides de la
rxpresión...
por ej x +((2 /y) donde, en este ejemplo le falta un parentesis... y otra
es
que supongamos tenga la misma expresión (pero sintacticamente correcta)

x +((2 /y)) pero en este caso y como con alta probabilidad puede pasar en
las expresiones que deseo analizar y puede ser 0. Considerando esto y que
las funciones que puedo utilizar en este evaluador de expresiones son
cerca
de 30... la verdad que NO SE SI PUEDO determinar cuales son todos los
posibles errores que puede arrojarme... para ir probando y decir bueno...
error división por 0, bueno error overflow, bueno etc etc.
ademas que valores aleatorios asignaría a una función como la siguiente y
con probabilidades de que no me de un error insalvable, capturable e
identificable.

x1 + ((x2^(x3/2)- sqrt(x4-y1*3)/(1/2)) * ((sin x1) + (cos c3/d4))...
nuevamente gracias.

Hugo Gsell


"Sergio E." <gruporemp[ARROBA]hotmail.com> escribió en el mensaje
news:
Hola, lo unico que se me ocurre aqui de momento es recordar mis viejas
clases de compiladores, donde en alguna de las practicas generamos un
compilador que procesa este tipo de expresiones, utilizando funciones
para
definir lo que es un termino, una expresion, etc... donde a la funcion
principal le pasas como parametro la expresion a validar y se intenta
resolverla..., arrojando una excepcion si algo no anda bien...
Si te interesa implementar algo asi, mandame un mensaje y te busco las
funciones esas...


Saludo
Sergio E.


"Hugo Gsell" escribió en el mensaje
news:
Necesito un analizador de expresiones algebraicas no un 'resolvedor'
( si existe el término jeje).
Es decir, necesito evaluar si una expresión es sintacticamente válida...
no resolverla sino simplemente evaluar su sintaxis.

Las expresiones pueden ser algo como y necesito saber si es válida...
esta creo que no lo es jeje.

x + Sin(y-1) / (((Cos(z+4) ^ 2 * sqr (w))

Hugo A. Gsell










email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida