Пример #1
0
 public ObtenerObjeto(Expresion nombre, Expresion parametro)
 {
     this.nombre    = nombre;
     this.parametro = parametro;
 }
Пример #2
0
        public override Simbolo evaluar(Entorno entorno, Reporte reporte)
        {
            Tipo tipo = new Tipo(Tipos.BOOLEAN, null);

            Simbolo izquierda = null;

            if (llamada == null)
            {
                izquierda = this.izquierda.evaluar(entorno, reporte);
            }
            else
            {
                object retornoLlamada = this.llamada.ejecutar(entorno, reporte);
                if (retornoLlamada == null)
                {
                    throw new util.ErrorPascal(0, 0, "La llamada no retorno ningun valor", "semantico", reporte);
                }
                izquierda = (Simbolo)retornoLlamada;
            }

            //Simbolo izquierda = this.izquierda.evaluar(entorno,reporte);
            if (this.derecha == null)
            {
                return(getValor(izquierda));
            }
            Simbolo derecha = this.derecha.evaluar(entorno, reporte);

            Tipos tipoResultante = util.TablaTipos.getTipo(izquierda.tipo, derecha.tipo);

            if (tipoResultante == Tipos.NULLL)
            {
                throw new util.ErrorPascal(0, 0, "Tipos De Dato Incorrectos", "Semantico", reporte);
            }

            switch (tipoOperacion)
            {
            case "=":
                if (izquierda.tipo.tipo == Tipos.STRING || izquierda.tipo.tipo == Tipos.STRING)
                {
                    return(new Simbolo(izquierda.ToString() == derecha.ToString(), tipo, null));
                }
                return(new Simbolo(double.Parse(izquierda.ToString()) == double.Parse(derecha.ToString()), tipo, null));

            case "<>":
                return(new Simbolo(double.Parse(izquierda.ToString()) != double.Parse(derecha.ToString()), tipo, null));

            case ">=":
                return(new Simbolo(double.Parse(izquierda.ToString()) >= double.Parse(derecha.ToString()), tipo, null));

            case ">":
                return(new Simbolo(double.Parse(izquierda.ToString()) > double.Parse(derecha.ToString()), tipo, null));

            case "<=":
                return(new Simbolo(double.Parse(izquierda.ToString()) <= double.Parse(derecha.ToString()), tipo, null));

            case "<":
                return(new Simbolo(double.Parse(izquierda.ToString()) < double.Parse(derecha.ToString()), tipo, null));

            default:
                return(null);
            }

            Simbolo getValor(Simbolo izquierda)
            {
                if (izquierda.tipo.tipo != Tipos.BOOLEAN)
                {
                    throw new util.ErrorPascal(0, 0, "La entrada no es de tipo booleano", "semántico", reporte);
                }
                return(new Simbolo(bool.Parse(izquierda.ToString()) == true, tipo, null));
            }
        }
Пример #3
0
 public Aritmetica(Expresion izquierda, Expresion derecha, char tipo)
 {
     this.izquierda = izquierda;
     this.derecha   = derecha;
     this.tipo      = tipo;
 }
Пример #4
0
 public Relacional(Expresion izquierda, Expresion derecha, string tipoOperacion)
 {
     this.izquierda     = izquierda;
     this.derecha       = derecha;
     this.tipoOperacion = tipoOperacion;
 }
Пример #5
0
 public Not(Expresion expresion)
 {
     this.expresion = expresion;
 }