Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Como Crear Un Interprete de Expresiones en NET
Como Crear Un Interprete de Expresiones en NET
intrprete de
expresiones en
.NET?
Alberto Poblacin
Listado 1:
public class Intrprete
{
private string expresion;
private int posicion;
private Simbolo ltimoSimbolo;
private double ltimaConstante;
private Stack<double> pila;
private double valorDeX;
public Intrprete(string expresion)
{
this.expresion = expresion;
}
public double Evaluar(double x)
{
this.valorDeX = x;
this.posicion = 0;
this.pila = new Stack<double>();
ltimoSimbolo = ObtenerSiguienteSmbolo();
Expresion();
if (pila.Count<1)
throw new Exception("Error al leer de la pila");
return pila.Pop();
}
private Simbolo ObtenerSiguienteSmbolo()
{
char c;
do
{
if (posicion>=expresion.Length)
return Simbolo.FinDeLaExpresin;
c = expresion[posicion++];
}
while (c==' '); //Despreciamos los espacios en blanco
switch (c)
{
case 'x': case 'X': return Simbolo.Variable;
case '(': return Simbolo.AbrirParntesis;
case ')': return Simbolo.CerrarParntesis;
case '+': return Simbolo.Suma;
case '-': return Simbolo.Resta;
case '*': return
Simbolo.Multiplicacin;
case '/': return Simbolo.Divisin;
}
Regex re = new Regex(@"^\d+([,\.]\d+)?");
string exp = expresion.Substring(posicion-1);
if (re.IsMatch(exp))
{
Match m = re.Match(exp);
string s = m.Value;
posicion += m.Length-1;
ltimaConstante =
double.Parse(s.Replace(".",","));
return Simbolo.Constante;
}
throw new Exception(
"Simbolo no reconocido en la posicin " + posicion);
}
Contina...
else if (ltimoSimbolo==Simbolo.Variable)
{
OperacionVariable();
ltimoSimbolo = ObtenerSiguienteSmbolo();
}
else
throw new Exception("Factor");
}
private void OperacionConstante()
{
pila.Push(ltimaConstante);
}
private void OperacionVariable()
{
pila.Push(valorDeX);
}
private void OperacionSuma()
{
pila.Push(pila.Pop()+pila.Pop());
}
private void OperacionResta()
{
double op2 = pila.Pop();
double op1 = pila.Pop();
pila.Push(op1-op2);
}
private void OperacionMultiplicacion()
{
pila.Push(pila.Pop()*pila.Pop());
}
private void OperacionDivision()
{
double op2 = pila.Pop();
double op1 = pila.Pop();
pila.Push(op1/op2);
}
}
enum Simbolo
{
Ninguno,
Suma, Resta, Multiplicacin, Divisin,
AbrirParntesis, CerrarParntesis,
Constante, Variable,
FinDeLaExpresin
}
Este listado contiene una clase Intrprete, que recibe la expresin a interpretar a
travs de su constructor. Para evaluar la expresin se llama al mtodo Evaluar,
que recibe el valor para la variable x que hemos previsto admitir en nuestras
expresiones. Mediante este mecanismo, se puede ir llamando repetidamente al
intrprete para que evale la expresin con distintos valores de x (por ejemplo,
para dibujar una grfica).
Aplicando procedimientos similares a los que hemos visto aqu, se pueden procesar
expresiones tan complejas como deseemos, pudiendo llegar incluso a crear un
lenguaje de programacin completo.
Acerca de campusMVP
CampusMVP te ofrece la mejor formacin en tecnologa Microsoft a travs de nuestros
cursos online y nuestros libros especializados, impartidos y escritos por conocidos MVP de
Microsoft. Visita nuestra pgina y prueba nuestros cursos y libros gratuitamente. wwwcampusmvp.com