Beispiel #1
0
        public Resultado ejecutar(ParseTreeNode raiz)
        {
            Resultado resultado = null;

            opL = new Logica();
            Resultado valor  = opL.operar(raiz.ChildNodes[0]);
            Boolean   estado = false;

            foreach (ParseTreeNode nodoCaso in raiz.ChildNodes[1].ChildNodes)
            {
                opL = new Logica();
                Resultado valorCaso = opL.operar(nodoCaso.ChildNodes[0]);
                if (valorCaso.tipo.Equals(valor.tipo))
                {
                    if (valorCaso.valor.ToString().Equals(valor.valor.ToString()))
                    {
                        TablaSimbolo aux = Interprete.tabla;
                        Interprete.tabla          = new TablaSimbolo();
                        Interprete.tabla.anterior = aux;
                        resultado        = interprete.ejecutar(nodoCaso.ChildNodes[1]);
                        Interprete.tabla = aux;
                        estado           = true;
                    }
                }
                else
                {
                    agregarError("Semantico", "El valor a comparar debe ser de igual tipo al valor del caso", nodoCaso.Span.Location.Line, nodoCaso.Span.Location.Column);
                }

                if (resultado != null)
                {
                    if (resultado.detener)
                    {
                        resultado = null;
                        break;
                    }
                }
            }
            if (!estado && raiz.ChildNodes.Count == 3)
            {
                TablaSimbolo aux = Interprete.tabla;
                Interprete.tabla          = new TablaSimbolo();
                Interprete.tabla.anterior = aux;
                resultado        = interprete.ejecutar(raiz.ChildNodes[2].ChildNodes[0]);
                Interprete.tabla = aux;
            }

            return(resultado);
        }
Beispiel #2
0
        private List <Resultado> getvalParametros(ParseTreeNode nodoValores)
        {
            List <Resultado> valores = new List <Resultado>();

            foreach (ParseTreeNode exp in nodoValores.ChildNodes)
            {
                Logica    opL       = new Logica();
                Resultado resultado = opL.operar(exp);
                if (!resultado.tipo.Equals("Error"))
                {
                    valores.Add(resultado);
                }
            }
            return(valores);
        }
Beispiel #3
0
        public Boolean asignar(ParseTreeNode raiz)
        {
            Object variable = getVariable(raiz.ChildNodes[0].ChildNodes[0]);

            opL = new Logica();
            Resultado resultado = opL.operar(raiz.ChildNodes[1]);

            if (variable.GetType().Name.Equals("Simbolo"))
            {
                Simbolo s = (Simbolo)variable;
                s.valor = resultado.valor;;
            }
            else if (variable.GetType().Name.Equals("Atributo"))
            {
                Atributo a = (Atributo)variable;
                a.valor = resultado.valor;
            }
            return(false);
        }
Beispiel #4
0
        public Resultado ejecutar(ParseTreeNode raiz)
        {
            Resultado resultado = null;

            opL = new Logica();
            Resultado condicion = opL.operar(raiz.ChildNodes[0]);

            if (condicion.valor != null)
            {
                if ((condicion.tipo.Equals("bool") || condicion.tipo.Equals("integer")) && (condicion.valor.ToString().Equals("0") || condicion.valor.ToString().Equals("1")))
                {
                    if (condicion.valor.ToString().Equals("1"))
                    {
                        TablaSimbolo aux = Interprete.tabla;
                        Interprete.tabla          = new TablaSimbolo();
                        Interprete.tabla.anterior = aux;
                        resultado        = interprete.ejecutar(raiz.ChildNodes[1]);
                        Interprete.tabla = aux;
                    }
                    else if (condicion.valor.ToString().Equals("0") && raiz.ChildNodes.Count == 3)
                    {
                        TablaSimbolo aux = Interprete.tabla;
                        Interprete.tabla          = new TablaSimbolo();
                        Interprete.tabla.anterior = aux;
                        resultado        = interprete.ejecutar(raiz.ChildNodes[2]);
                        Interprete.tabla = aux;
                    }
                }
                else
                {
                    agregarError("Semantico", "La condicion de una sentencia de control solo puede ser tipo Bool o Integer(0|1)", raiz.Span.Location.Line, raiz.Span.Location.Column);
                    return(null);
                }
            }
            else
            {
                //error
                return(null);
            }

            return(resultado);
        }
Beispiel #5
0
        public Boolean declaracion(ParseTreeNode raiz)
        {
            if (raiz.ChildNodes.Count == 3)
            {
                ParseTreeNodeList ids      = raiz.ChildNodes[0].ChildNodes;
                String            tipoDato = raiz.ChildNodes[1].ChildNodes[0].Token.Text.ToLower();
                opL = new Logica();

                foreach (ParseTreeNode id in ids)
                {
                    opL = new Logica();
                    Resultado resultado = opL.operar(raiz.ChildNodes[2].ChildNodes[0]);
                    resultado = comprobarTipos(tipoDato, resultado.tipo, resultado, raiz.Span.Location.Line, raiz.Span.Location.Column);
                    if (!resultado.tipo.Equals("Error"))
                    {
                        Simbolo variable = new Simbolo(tipoDato, id.Token.Text, resultado.valor);
                        Boolean estado   = Interprete.tabla.setSimbolo3(variable);
                        if (!estado)
                        {
                            agregarError("Semantico", "La variable " + id.Token.Text + " ya existe", id.Span.Location.Line, id.Span.Location.Column);
                        }
                    }
                }
            }
            else if (raiz.ChildNodes.Count == 2)
            {
                ParseTreeNodeList ids      = raiz.ChildNodes[0].ChildNodes;
                String            tipoDato = raiz.ChildNodes[1].ChildNodes[0].Token.Text.ToLower();
                foreach (ParseTreeNode id in ids)
                {
                    Simbolo  variable = null;
                    DateTime today;
                    switch (tipoDato)
                    {
                    case "text":
                        variable = new Simbolo(tipoDato, id.Token.Text, "");
                        break;

                    case "integer":
                        variable = new Simbolo(tipoDato, id.Token.Text, 0);
                        break;

                    case "double":
                        variable = new Simbolo(tipoDato, id.Token.Text, 0.0);
                        break;

                    case "bool":
                        variable = new Simbolo(tipoDato, id.Token.Text, 0);
                        break;

                    case "date":
                        today    = DateTime.Today;
                        variable = new Simbolo(tipoDato, id.Token.Text, today.ToString("dd-MM-yyyy"));
                        break;

                    case "datetime":
                        today    = DateTime.Today;
                        variable = new Simbolo(tipoDato, id.Token.Text, today.ToString("dd-MM-yyyy hh:mm:ss"));
                        break;

                    default:
                        Objeto objeto = instanciarObjeto(tipoDato, id.Span.Location.Line, id.Span.Location.Column);
                        if (objeto != null)
                        {
                            String nombreObjeto = raiz.ChildNodes[0].ChildNodes[0].Token.Text.ToLower();
                            variable = new Simbolo(tipoDato, nombreObjeto, objeto);
                        }
                        else
                        {
                            return(false);
                        }
                        break;
                    }
                    Boolean estado = Interprete.tabla.setSimbolo3(variable);
                    if (!estado)
                    {
                        agregarError("Semantico", "La variable " + id.Token.Text + " ya existe", id.Span.Location.Line, id.Span.Location.Column);
                    }
                }
            }
            return(false);
        }
Beispiel #6
0
        public Resultado ejecutar(ParseTreeNode raiz)
        {
            Resultado resultado = null;

            ParseTreeNode nodoDeclaracion = raiz.ChildNodes[0];

            if (!nodoDeclaracion.ChildNodes[1].ChildNodes[0].Token.Text.ToLower().Equals("integer"))
            {
                //reportar error
                return(null);
            }

            //cambiar ambito
            TablaSimbolo aux = Interprete.tabla;

            Interprete.tabla          = new TablaSimbolo();
            Interprete.tabla.anterior = aux;
            ParseTreeNode SENTSPROC = new ParseTreeNode(new NonTerminal("SENTSPROC"), raiz.Span);

            SENTSPROC.ChildNodes.Add(nodoDeclaracion);
            interprete.ejecutar(SENTSPROC);

            opL = new Logica();
            Resultado     condicion      = opL.operar(raiz.ChildNodes[1]);
            String        operacion      = raiz.ChildNodes[2].ChildNodes[0].Token.Text;
            ParseTreeNode nodoSentencias = raiz.ChildNodes[3];

            if (condicion.valor != null && (condicion.tipo.Equals("integer") || (condicion.tipo.Equals("bool"))))
            {
                while (condicion.valor.ToString().Equals("1"))
                {
                    TablaSimbolo aux2 = Interprete.tabla;
                    Interprete.tabla          = new TablaSimbolo();
                    Interprete.tabla.anterior = aux2;
                    resultado        = interprete.ejecutar(nodoSentencias);
                    Interprete.tabla = aux2;
                    if (condicion.valor.ToString().Equals("1"))
                    {
                        if (resultado != null)
                        {
                            if (resultado.detener)
                            {
                                resultado = null;
                                break;
                            }
                        }

                        Simbolo simbolo = Interprete.tabla.getSimbolo2(nodoDeclaracion.ChildNodes[0].ChildNodes[0].Token.Text.Replace("@", "").ToLower());
                        if (operacion.Equals("++"))
                        {
                            simbolo.valor = Convert.ToInt64(simbolo.valor) + 1;
                        }
                        else
                        {
                            simbolo.valor = Convert.ToInt64(simbolo.valor) - 1;
                        }

                        opL       = new Logica();
                        condicion = opL.operar(raiz.ChildNodes[1]);
                    }
                }
            }
            else
            {
                agregarError("Semantico", "La condicion de una sentencia de control solo puede ser tipo Bool o Integer(0|1)", raiz.Span.Location.Line, raiz.Span.Location.Column);
                return(null);
            }

            Interprete.tabla = aux;

            return(resultado);
        }