Evaluador de expresiones

15/06/2005 - 21:49 por Jose Antonio | Informe spam
Alguien conoce algun evaluador de expresiones profesional que venda alguna
empresa de desarrollo?

Saludos.

Preguntas similare

Leer las respuestas

#1 Tristan
15/06/2005 - 22:35 | Informe spam
Jose antonio. No se si te parecerá profesional. Creé una clase que hace eso
hace unos años. En realidad lo único que hace es simplificar el uso de una
clase del framework, que es la que realmente evalúa la expresión. El
resultado y las posibilidades que ofrece son exactamente las mismas que las
expresiones de una aplicación C#, puesto que simplemente utiliza el
compilador de C# (al vuelo y en memoria) para obtener el resultado.

Si te interesa, puedo dejarla de nuevo por aquí.

Por otro lado, puedes usar vbscript o java script, para evaluar la
expresión.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#2 Jose Antonio
16/06/2005 - 00:19 | Informe spam
Tristan, he visto varios evaluadores de expresiones, sin embargo no he
conseguido que ninguno haga los siguiente:

El usuario tiene varias lineas para poder realizar calculos antes de llegar
a la solucion final, para que estos calculos sean mas legibles, por ejemplo:

Linea-1: A=6*PI
Linea-2: N=A/5
Linea-3 B=A^(16+N)
Linea-4 H=SQR(A^2+B^2)
Linea-5 RESULTADO=H*B*N/A

El evaluador tiene que ir guardando los valores de las variables según se
utilicen, hasta dar el resultado final.

Se podría hacer con tu clase?

Saludos y gracias.
"Tristan" escribió en el mensaje
news:
Jose antonio. No se si te parecerá profesional. Creé una clase que hace
eso hace unos años. En realidad lo único que hace es simplificar el uso de
una clase del framework, que es la que realmente evalúa la expresión. El
resultado y las posibilidades que ofrece son exactamente las mismas que
las expresiones de una aplicación C#, puesto que simplemente utiliza el
compilador de C# (al vuelo y en memoria) para obtener el resultado.

Si te interesa, puedo dejarla de nuevo por aquí.

Por otro lado, puedes usar vbscript o java script, para evaluar la
expresión.

Juan Carlos Badiola
MVP - C#

Respuesta Responder a este mensaje
#3 Tristan
16/06/2005 - 20:19 | Informe spam
No se qué ha pasado. Respondí a tu pregunta pero la respuesta no aparece. Tal
vez aparezca duplicada.

La clase de la que te hablo, permite evaluar expresiones C#, o incluso
prácticamente crear aplicaciones completas en tiempo de ejecución, pero creo
que para lo que tú quieres no es necesaria. Basta con usar scripting. Yo creo
que VBScript es lo más adecuado en tu caso.

Por ejemplo:

string codigo "Pi = 3.141592653 " +
"A = 6 * Pi " +
"N = A/5 " +
"B = A^(16+N) " +
"H = SQR(A^2+B^2) " +
"Resultado = B*N/A ";

ComObject script = ComObject.CreateObject("MSScriptControl.ScriptControl");
script["Language"] = "VBScript";
script.Invoke("AddCode", codigo);
MessageBox.Show(script.Invoke("Eval", "Resultado").Value.ToString());


Para ejecutar este código necesitas esta otra clase que creé hace poco, para
hacer más intuitivo el trabajo con objetos COM, simplificando reflection:

class ComObject
{
private object objeto;
private Type tipo;

public ComObject(object comObj)
{
objeto = comObj;
if (objeto != null)
tipo = comObj.GetType();
}

public static ComObject CreateObject(string @class)
{
Type tipo = Type.GetTypeFromProgID(@class, true);
return new ComObject(Activator.CreateInstance(tipo));
}

public ComObject Invoke(string methodName, params object[] parameters)
{
return new ComObject(tipo.InvokeMember(methodName,
BindingFlags.InvokeMethod,
null, objeto, parameters));
}

public object Value
{
get {return objeto;}
}

public object this[string propertyName]
{
set
{
tipo.InvokeMember(
propertyName, BindingFlags.SetProperty, null, objeto, new
object[] {value});
}
get
{
return tipo.InvokeMember(
propertyName, BindingFlags.GetProperty, null, objeto, null);
}
}
}

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#4 Jose Antonio
16/06/2005 - 21:30 | Informe spam
Voy a probar la velocidad del VBScript, de todas las maneras,con lo que me
dices que puede llegar a hacer la clase de c#, tambien me gustaria probarla.


Saludos.

"Tristan" escribió en el mensaje
news:
No se qué ha pasado. Respondí a tu pregunta pero la respuesta no aparece.
Tal
vez aparezca duplicada.

La clase de la que te hablo, permite evaluar expresiones C#, o incluso
prácticamente crear aplicaciones completas en tiempo de ejecución, pero
creo
que para lo que tú quieres no es necesaria. Basta con usar scripting. Yo
creo
que VBScript es lo más adecuado en tu caso.

Por ejemplo:

string codigo > "Pi = 3.141592653 " +
"A = 6 * Pi " +
"N = A/5 " +
"B = A^(16+N) " +
"H = SQR(A^2+B^2) " +
"Resultado = B*N/A ";

ComObject script =
ComObject.CreateObject("MSScriptControl.ScriptControl");
script["Language"] = "VBScript";
script.Invoke("AddCode", codigo);
MessageBox.Show(script.Invoke("Eval", "Resultado").Value.ToString());


Para ejecutar este código necesitas esta otra clase que creé hace poco,
para
hacer más intuitivo el trabajo con objetos COM, simplificando reflection:

class ComObject
{
private object objeto;
private Type tipo;

public ComObject(object comObj)
{
objeto = comObj;
if (objeto != null)
tipo = comObj.GetType();
}

public static ComObject CreateObject(string @class)
{
Type tipo = Type.GetTypeFromProgID(@class, true);
return new ComObject(Activator.CreateInstance(tipo));
}

public ComObject Invoke(string methodName, params object[] parameters)
{
return new ComObject(tipo.InvokeMember(methodName,
BindingFlags.InvokeMethod,
null, objeto, parameters));
}

public object Value
{
get {return objeto;}
}

public object this[string propertyName]
{
set
{
tipo.InvokeMember(
propertyName, BindingFlags.SetProperty, null, objeto, new
object[] {value});
}
get
{
return tipo.InvokeMember(
propertyName, BindingFlags.GetProperty, null, objeto, null);
}
}
}

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#5 Tristan
17/06/2005 - 19:10 | Informe spam
Lógicamente la velocidad y eficiencia de vbscript, será muy superior a la de
C#, a la hora de evaluar dinámicamente. Los intérpretes son ideales
precisamente para hacer eso, para ejecutar código sobre la marcha.

Por otro lado, una de las grandes virtudes de C# se convertiría en una
desventaja fundamental en tu caso. C# es un lenguaje muy estricto. Las
variables deben ser declaradas, tipadas, y casi no se producen conversiones
implícitas de tipo. En tu ejemplo, es necesario que el lenguaje sea poco
estricto.

Tengo también tengo una clase para evaluar código vb.net. Tendría la misma
desventaja de eficiencia, pero al menos admite una sintaxis poco estricta.

En fin, si te interesa una de las dos, no tengo ningún problema en
compartirla, pero no creo que sean una buena opción en tu caso.

Yo utilizará las clases CSharpEvaluator o VBEvaluator, para crear código que
pueda modificar o acceder a datos de tu aplicación, o en general cuando
quieras que el código evaluado sea C# o vb.net.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida