Exemplo n.º 1
0
 public sentencia(String tipo, List <String> ids, arbol_expresion expresion, int fila, int columna)
 {
     this.tipo      = tipo;
     this.ids       = ids;
     this.expresion = expresion;
     this.fila      = fila;
     this.columna   = columna;
 }
Exemplo n.º 2
0
        public static nodo_expresion dibujarEXP(sentencia sentencia)
        {
            if (sentencia.expresion.raiz.parametros.Count > 1)
            {
                errores.errores.add_error("Error Semantico", "Parametros incorrectos en funcion DibujarEXP", sentencia.fila, sentencia.columna);
                return(new nodo_expresion("error", "error", "error", sentencia.fila, sentencia.columna));
            }

            arbol_expresion expresion = sentencia.expresion.raiz.parametros.ElementAt(0);
            //probar que la ruta exista
            String ruta = @const.RUTA;

            ruta = ruta.Replace("/", "\\\\").Replace("\"", "");
            if (Directory.Exists(ruta))
            {
                @const.dibujar_expresion(expresion.raiz, @const.get_nombre_expresion());
            }
            else
            {
                Directory.CreateDirectory(ruta);
                @const.dibujar_expresion(expresion.raiz, @const.get_nombre_expresion());
            }
            return(@const.VOID);
        }
Exemplo n.º 3
0
        public nodo_expresion extraer_arbol(ParseTreeNode raiz)
        {
            String termino = "", token = "";

            if (raiz.Term != null)
            {
                termino = raiz.Term.ToString();
            }
            if (raiz.Token != null)
            {
                token = raiz.Token.Text;
            }

            if (termino.Equals("NUMERO") || termino.Equals("CADENA") || termino.Equals("True") || termino.Equals("False") || termino.Equals("ID"))
            {
                String tipo = "";
                if (termino.Equals("NUMERO"))
                {
                    tipo = "number";
                }
                else if (termino.Equals("CADENA"))
                {
                    tipo = "string";
                }
                else if (termino.Equals("True"))
                {
                    token = "1";
                    tipo  = "bool";
                }
                else if (termino.Equals("False"))
                {
                    token = "0";
                    tipo  = "bool";
                }
                else
                {
                    tipo = "id";
                }
                nodo_expresion nuevo = new nodo_expresion(token.Replace("\"", ""), "terminal", tipo, raiz.Token.Location.Line, raiz.Token.Location.Column);
                return(nuevo);
            }
            else if (termino.Equals("llamar_funcion"))
            {
                nodo_expresion         funcion     = new nodo_expresion(raiz.ChildNodes.ElementAt(0).Token.Text, "llamar_funcion", "llamar_funcion", raiz.ChildNodes.ElementAt(0).Token.Location.Line, raiz.ChildNodes.ElementAt(0).Token.Location.Column);
                List <arbol_expresion> expresiones = new List <arbol_expresion>();
                ParseTreeNode          lista       = raiz.ChildNodes.ElementAt(1);
                for (int i = 0; i < lista.ChildNodes.Count; i++)
                {
                    arbol_expresion arbol = new arbol_expresion();
                    arbol.raiz = extraer_arbol(lista.ChildNodes.ElementAt(i));
                    expresiones.Add(arbol);
                }
                funcion.parametros = expresiones;
                //METER PARAMETROS AL NODO
                return(funcion);
            }
            else if (termino.Equals("exprecion"))
            {
                if (raiz.ChildNodes.Count == 3)
                {
                    nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                    nodo_expresion der = extraer_arbol(raiz.ChildNodes.ElementAt(2));
                    nodo_expresion op  = extraer_arbol(raiz.ChildNodes.ElementAt(1));
                    op.izq = izq;
                    op.der = der;
                    return(op);
                }
                else if (raiz.ChildNodes.Count == 2)
                {
                    nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(1));
                    nodo_expresion op  = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                    op.izq = izq;
                    return(op);
                }
                else
                {
                    nodo_expresion nodo = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                    return(nodo);
                }
            }
            else if (termino.Equals("relacion"))
            {
                nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                nodo_expresion der = extraer_arbol(raiz.ChildNodes.ElementAt(2));
                nodo_expresion op  = extraer_arbol(raiz.ChildNodes.ElementAt(1));
                op.izq = izq;
                op.der = der;
                return(op);
            }
            else if (termino.Equals("condicion"))
            {
                if (raiz.ChildNodes.Count == 3)
                {
                    nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                    nodo_expresion der = extraer_arbol(raiz.ChildNodes.ElementAt(2));
                    nodo_expresion op  = extraer_arbol(raiz.ChildNodes.ElementAt(1));
                    op.izq = izq;
                    op.der = der;
                    return(op);
                }
                else if (raiz.ChildNodes.Count == 2)
                {
                    nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(1));
                    nodo_expresion op  = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                    op.izq = izq;
                    return(op);
                }
                else
                {
                    nodo_expresion nodo = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                    return(nodo);
                }
            }
            else if (!termino.Equals("exprecion"))
            {
                nodo_expresion nuevo;
                try
                {
                    nuevo = new nodo_expresion(token, "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                }
                catch (Exception e) {
                    nuevo = new nodo_expresion(token, "operador", "operador", -1, -1);
                }
                return(nuevo);
            }


            return(null);


            //Console.WriteLine(termino + " , " + token);
        }
Exemplo n.º 4
0
        void recorrer_arbol(ParseTreeNode raiz)
        {
            String termino = "", token = "";

            if (raiz.Term != null)
            {
                termino = raiz.Term.ToString();
            }
            if (raiz.Token != null)
            {
                token = raiz.Token.ToString();
            }
            if (termino.Equals("incerteza"))
            {
                String numero    = raiz.ChildNodes.ElementAt(1).Token.Text;
                Double incerteza = Double.Parse(numero.Replace('.', ','));
                this.interprete.set_incerteza(incerteza);
            }
            else if (termino.Equals("ruta"))
            {
                String ruta = raiz.ChildNodes.ElementAt(1).Token.Text;
                this.interprete.set_ruta(ruta);
            }
            else if (termino.Equals("incluye"))
            {
                String texto   = "";
                String incluye = raiz.ChildNodes.ElementAt(1).Token.Text;
                try
                {
                    String   ruta   = contenedor.SelectedTab.Name;
                    String[] partes = ruta.Split('\\');
                    ruta = "";
                    for (int i = 0; i < partes.Length - 1; i++)
                    {
                        ruta += partes[i] + "\\";
                    }
                    System.IO.StreamReader file = new System.IO.StreamReader(ruta + incluye);
                    texto = file.ReadToEnd();
                    file.Close();

                    analizar(texto);
                }
                catch (Exception e) {
                    errores.errores.add_error("Error Semantico", "Archivo " + incluye + " inaccesible", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                    return;
                }


                /*
                 * String incluye = raiz.ChildNodes.ElementAt(1).Token.Text;
                 * Console.WriteLine("debería de incluir " + incluye);
                 * analizar("Define 666 Define \"nuevo\" Principal () { alo= polisia; }");
                 */
            }
            else if (termino.Equals("declaracion"))
            {
                String        tipo = raiz.ChildNodes.ElementAt(0).Token.Text;
                List <String> ids  = new List <string>();
                for (int i = 0; i < raiz.ChildNodes.ElementAt(1).ChildNodes.Count; i++)
                {
                    ids.Add(raiz.ChildNodes.ElementAt(1).ChildNodes.ElementAt(i).Token.Text);
                }
                arbol_expresion arbol = new arbol_expresion();

                if (raiz.ChildNodes.ElementAt(2).ChildNodes.Count > 0)
                {
                    arbol.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(2).ChildNodes.ElementAt(1));
                    //@const.dibujar_expresion(arbol.raiz, "prueba_expresion");

                    /*nodo_expresion resultado= arbol.ejecutar_arbol();
                     * Console.WriteLine("----------------------");
                     * Console.WriteLine(resultado.valor + " " + resultado.tipo + " " + resultado.rol);
                     * Console.WriteLine("----------------------");
                     */
                }

                interprete.add_sentencia("declarar", ids, arbol, tipo.ToLower(), raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
            }
            else if (termino.Equals("declarar_funcion"))
            {
                if (raiz.ChildNodes.ElementAt(0).Token.Text.Equals("Principal"))
                {
                    interprete.funcion_nueva("Principal", interprete.get_funcion(), "void");
                    raiz.ChildNodes.ForEach(recorrer_arbol);
                    interprete.set_principal();
                    return;
                }
                else
                {
                    interprete.funcion_nueva(raiz.ChildNodes.ElementAt(1).Token.Text, interprete.get_funcion(), raiz.ChildNodes.ElementAt(0).Token.Text);
                    raiz.ChildNodes.ForEach(recorrer_arbol);
                    interprete.agregar_nombre(pars);
                    pars = "";
                    interprete.pop_funcion();
                    return;
                }
            }
            else if (termino.Equals("parametro"))
            {
                String tipo   = raiz.ChildNodes.ElementAt(0).Token.Text;
                String nombre = raiz.ChildNodes.ElementAt(1).Token.Text;
                interprete.add_parametro(tipo, nombre);
                pars += "#" + tipo.ToLower();
            }
            else if (termino.Equals("asignacion"))
            {
                String        id    = raiz.ChildNodes.ElementAt(0).Token.Text;
                List <String> lista = new List <string>();
                lista.Add(id);
                nodo_expresion  expresion = extraer_arbol(raiz.ChildNodes.ElementAt(2));
                arbol_expresion arbol     = new arbol_expresion();
                arbol.raiz = expresion;
                interprete.add_sentencia("asignacion", lista, arbol, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
            }
            else if (termino.Equals("retorno_noterminal"))
            {
                arbol_expresion arbol = new arbol_expresion();
                if (raiz.ChildNodes.Count > 1)
                {
                    arbol.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(1));
                }
                interprete.add_sentencia("retorno", null, arbol, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
            }
            else if (termino.Equals("sentencia_continuar"))
            {
                interprete.add_sentencia("continuar", null, new arbol_expresion(), raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
            }
            else if (termino.Equals("sentencia_detener"))
            {
                interprete.add_sentencia("detener", null, new arbol_expresion(), raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
            }
            else if (termino.Equals("call_funcion"))
            {
                arbol_expresion arbol = new arbol_expresion();
                arbol.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                interprete.add_sentencia("call_funcion", null, arbol, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
            }
            else if (termino.Equals("flujo_si"))
            {
                List <camino> caminos = new List <camino>();
                //extrae la condicion
                nodo_expresion cond = extraer_arbol(raiz.ChildNodes.ElementAt(0));

                //inserta funcion para anidar
                interprete.funcion_nueva("si", interprete.get_funcion(), "void");
                //inserta sentencias
                recorrer_arbol(raiz.ChildNodes.ElementAt(1));
                //obtiene el camino si
                funcion si = interprete.extraer_funcion();
                //agrega primer camino
                caminos.Add(new camino(cond, si));

                //obtener el else
                if (raiz.ChildNodes.ElementAt(2).ChildNodes.Count > 0)
                {
                    //si hay else
                    interprete.funcion_nueva("Sino", interprete.get_funcion(), "void");
                    recorrer_arbol(raiz.ChildNodes.ElementAt(2).ChildNodes.ElementAt(0));
                    funcion sino = interprete.extraer_funcion();
                    caminos.Add(new camino(null, sino));
                }
                interprete.add_sentencia("si", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                return;
            }
            else if (termino.Equals("flujo_selecciona"))
            {
                List <camino> caminos = new List <camino>();
                //extrae la expresion a comparar
                nodo_expresion expresion    = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                ParseTreeNode  pares        = raiz.ChildNodes.ElementAt(1);
                int            caminos_cant = pares.ChildNodes.Count;
                for (int i = 0; i < caminos_cant; i++)
                {
                    ParseTreeNode par = pares.ChildNodes.ElementAt(i);
                    //hacer condicion
                    nodo_expresion condicion = new nodo_expresion("==", "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                    condicion.izq = expresion;
                    //extraer valor
                    nodo_expresion valor = extraer_arbol(par.ChildNodes.ElementAt(0));
                    condicion.der = valor;

                    //extraer el camino
                    interprete.funcion_nueva("camino", interprete.get_funcion(), "void");
                    recorrer_arbol(par.ChildNodes.ElementAt(1));
                    funcion flujo = interprete.extraer_funcion();
                    //insertar el camino
                    caminos.Add(new camino(condicion, flujo));
                }
                //obtener el Defecto
                if (raiz.ChildNodes.ElementAt(2).ChildNodes.Count > 0)
                {
                    //si hay defecto
                    interprete.funcion_nueva("defecto", interprete.get_funcion(), "void");
                    recorrer_arbol(raiz.ChildNodes.ElementAt(2).ChildNodes.ElementAt(0));
                    funcion defecto = interprete.extraer_funcion();
                    caminos.Add(new camino(null, defecto));
                }
                interprete.add_sentencia("selecciona", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                return;
            }
            else if (termino.Equals("flujo_para"))
            {
                //crear sentencia de asignacion inicial

                List <String> id = new List <string>();
                id.Add(raiz.ChildNodes.ElementAt(1).Token.Text);
                arbol_expresion expresion = new arbol_expresion();
                expresion.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(3));
                sentencia asignacion_inicial = new sentencia("declarar", id, expresion, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                asignacion_inicial.tipo_dato = "number";
                //extraer condicion
                nodo_expresion condicion = extraer_arbol(raiz.ChildNodes.ElementAt(4));

                //sacar flujo
                List <camino> caminos = new List <camino>();
                //inserta funcion para anidar
                interprete.funcion_nueva("para", interprete.get_funcion(), "void");
                //inserta sentencias
                recorrer_arbol(raiz.ChildNodes.ElementAt(6));
                //obtiene el camino
                funcion para = interprete.extraer_funcion();

                //meter paso al flujo
                nodo_expresion op  = new nodo_expresion("", "", "", -1, -1);
                nodo_expresion var = new nodo_expresion(id.ElementAt(0), "terminal", "id", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                nodo_expresion uno = new nodo_expresion("1", "terminal", "NUMERO", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);

                if (raiz.ChildNodes.ElementAt(5).Token.Text.Equals("++"))
                {
                    op = new nodo_expresion("+", "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                }
                else if (raiz.ChildNodes.ElementAt(5).Token.Text.Equals("--"))
                {
                    op = new nodo_expresion("-", "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                }

                op.izq = var;
                op.der = uno;

                arbol_expresion asignacion = new arbol_expresion();
                asignacion.raiz = op;
                sentencia paso = new sentencia("asignacion", id, asignacion, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);

                para.add_sentencia(paso);

                //agrega primer camino
                caminos.Add(new camino(condicion, para));



                //meter sentencia
                interprete.add_sentencia("para", asignacion_inicial, caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                return;
            }
            else if (termino.Equals("flujo_hasta"))
            {
                //extraer condicion
                nodo_expresion condicion = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                //sacar flujo
                List <camino> caminos = new List <camino>();
                //inserta funcion para anidar
                interprete.funcion_nueva("hasta", interprete.get_funcion(), "void");
                //inserta sentencias
                recorrer_arbol(raiz.ChildNodes.ElementAt(1));
                //obtiene el camino
                funcion hasta = interprete.extraer_funcion();

                //agrega primer camino
                caminos.Add(new camino(condicion, hasta));
                //meter sentencia
                interprete.add_sentencia("hasta", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                return;
            }
            else if (termino.Equals("flujo_mientras"))
            {
                //extraer condicion
                nodo_expresion condicion = extraer_arbol(raiz.ChildNodes.ElementAt(0));
                //sacar flujo
                List <camino> caminos = new List <camino>();
                //inserta funcion para anidar
                interprete.funcion_nueva("mientras", interprete.get_funcion(), "void");
                //inserta sentencias
                recorrer_arbol(raiz.ChildNodes.ElementAt(1));
                //obtiene el camino
                funcion mientras = interprete.extraer_funcion();

                //agrega primer camino
                caminos.Add(new camino(condicion, mientras));
                //meter sentencia
                interprete.add_sentencia("mientras", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column);
                return;
            }
            //Console.WriteLine("-"+termino+"-"+ token+"-");

            raiz.ChildNodes.ForEach(recorrer_arbol);
        }
Exemplo n.º 5
0
        public void add_sentencia(String tipo, arbol_expresion expresion, List <camino> caminos, int fila, int columna)
        {
            sentencia s = new sentencia(tipo, null, expresion, "", caminos, fila, columna);

            actual.add_sentencia(s);
        }
Exemplo n.º 6
0
        public void add_sentencia(String tipo, List <String> ids, arbol_expresion expresion, String tipo_dato, int fila, int columna)
        {
            sentencia s = new sentencia(tipo, ids, expresion, tipo_dato, null, fila, columna);

            actual.add_sentencia(s);
        }
Exemplo n.º 7
0
 public camino(nodo_expresion raiz, funcion funcion)
 {
     this.condicion      = new arbol_expresion();
     this.condicion.raiz = raiz;
     this.funcion        = funcion;
 }