Esempio n. 1
0
        public static Boolean declararVariable(String tipo, String nombre, String valor, String ambito)
        {
            ParseTreeNode nodo = Listas.nodoActual;
            Variable      v    = null;

            for (int a = 0; a < listaVariables.Count; a++)
            {
                v = (Variable)listaVariables[a];
                if (v.nombre == nombre && v.tipo == tipo && v.ambito == ambito)
                {
                    Reporte.agregarMensajeError("La variable '" + v.nombre + "' ya existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                    return(false);
                }
            }
            Variable nueva = new Variable();

            nueva.tipo   = tipo;
            nueva.nombre = nombre;
            nueva.valor  = valor;
            if (tipo == "Bool")
            {
                //{
                //    if (nueva.valor == "1")
                //       // nueva.valor = "true";
                //    else if (nueva.valor == "0")
                //        //nueva.valor = "false";
                //}
                nueva.ambito = ambito;
            }
            nueva.nivel = nivelAmbito;
            listaVariables.Add(nueva);
            return(true);
        }
Esempio n. 2
0
        public static Boolean asignarVariable(String nombre, String valor, String ambito)
        {
            ParseTreeNode nodo = Listas.nodoActual;

            for (int a = listaVariables.Count - 1; a > -1; a--)
            {
                Variable v = (Variable)listaVariables[a];
                if (v.nombre == nombre)
                {
                    if (PrimerRecorrido.concatenar == false)//Numero
                    {
                        if (v.tipo == "String")
                        {
                            Reporte.agregarMensajeError("Tipo incorrecto al asignar variable '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                            return(false);
                        }
                        else if (v.tipo == "Bool")
                        {
                            if (valor == "1")
                            {
                                //       valor = "true";
                            }
                            else if (valor == "0")
                            {
                                //     valor = "false";
                            }
                            else
                            {
                                Reporte.agregarMensajeError("Tipo incorrecto al asignar variable '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                                return(false);
                            }
                        }
                    }
                    else //Cadena
                    {
                        if (v.tipo == "Number")
                        {
                            Reporte.agregarMensajeError("Tipo incorrecto al asignar variable '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                            return(false);
                        }
                        if (v.tipo == "Bool")
                        {
                            if (!(valor == "1" || valor == "0" || valor == ""))
                            {
                                Reporte.agregarMensajeError("Tipo incorrecto al asignar variable '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                                return(false);
                            }
                        }
                    }
                    v.valor = valor;
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 3
0
        public static void generarAST(ParseTreeNode raiz, String nombre)
        {
            if (raiz == null)
            {
                Reporte.agregarMensajeError("La funcion es vacia", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                return;
            }

            String grafodot = DIBUJAR.getDotFuncion(raiz);
            String ruta     = "";

            if (Listas.ruta == "")
            {
                ruta = Listas.rutaDefinida + nombre;
            }
            else
            {
                if (Directory.Exists(Listas.ruta))
                {
                    ruta = Listas.quitarEspaciosFinal(Listas.ruta) + "\\" + nombre;
                }
                else
                {
                    Reporte.agregarError("No existe ruta: " + ruta, "Error General", 0, 0);
                    ruta = Listas.rutaDefinida + nombre;
                }
            }
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(ruta + ".dot"))
            {
                file.WriteLine(grafodot);
            }
            ProcessStartInfo startInfo = new ProcessStartInfo("C:\\Program Files (x86)\\Graphviz 2.28\\bin\\dot.exe");

            startInfo.Arguments = "dot -Tpng \"" + ruta + ".dot\" -o \"" + ruta + ".png\"";
            try
            {
                Process.Start(startInfo);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
        public static String action(ParseTreeNode nodo)
        {
            String result    = null;
            String variables = "";

            switch (nodo.Term.Name.ToString())
            {
            case "INICIO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[0]);
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "ENTRADA":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    Variables.pilaAmbito.Push("Global");
                    Variables.nivelAmbito = 0;
                    action(nodo.ChildNodes[0]);
                }
                break;
            }

            case "ENCABEZADO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[0]);
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "TIPO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    String[] numero = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    result = numero[0];
                }
                break;
            }

            case "DECLARACION":
            {
                if (nodo.ChildNodes.Count == 3)
                {
                    String   tipo   = action(nodo.ChildNodes[0]);
                    String   vars   = action(nodo.ChildNodes[1]);
                    String[] var    = (vars.Split(','));
                    String   ambito = Variables.pilaAmbito.Peek().ToString();
                    for (int i = 0; i < var.Length - 1; i++)
                    {
                        Variables.declararVariable(tipo, var[i], "", ambito);
                    }
                }
                else if (nodo.ChildNodes.Count == 4 || nodo.ChildNodes.Count == 5)
                {
                    String   tipo   = action(nodo.ChildNodes[0]);
                    String   vars   = action(nodo.ChildNodes[1]);
                    String[] var    = (vars.Split(','));
                    String   asig   = action(nodo.ChildNodes[3]);
                    String   ambito = Variables.pilaAmbito.Peek().ToString();
                    if (asig != "error")
                    {
                        for (int i = 0; i < var.Length - 1; i++)
                        {
                            Variables.declararVariable(tipo, var[i], asig, ambito);
                        }
                    }
                    else
                    {
                        Reporte.agregarMensajeError("Error al declarar la expresion en una variable global", "Error Semantico", 0, 0);
                    }
                }
                break;
            }

            case "VAR":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    String[] numero = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    variables += numero[0] + ",";
                    result     = variables;
                }
                else if (nodo.ChildNodes.Count == 3)
                {
                    result = action(nodo.ChildNodes[0]);
                    String[] dato = nodo.ChildNodes.ElementAt(2).ToString().Split(' ');
                    result += dato[0] + ",";
                }
                break;
            }

            case "ASIGNACION":
            {
                if (nodo.ChildNodes.Count == 3 || nodo.ChildNodes.Count == 4)
                {
                    String[] dato   = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    String   asig   = action(nodo.ChildNodes[2]);
                    String   ambito = Variables.pilaAmbito.Peek().ToString();
                    Variables.asignarVariable(dato[0], asig, ambito);
                }
                break;
            }

            case "INSTRUCCIONES":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[0]);
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "INSTRUCCION":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    //action(node.ChildNodes[0]);
                }
                break;
            }

            case "RETORNAR":
            {
                // MessageBox.Show("TIPO");
                if (nodo.ChildNodes.Count == 3)
                {
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "LLAMADA(":
            {
                Metodo_Funcion.parametrosTemp.Clear();
                if (nodo.ChildNodes.Count == 3)
                {
                    String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[0];
                    ParseTreeNode metodo = Metodo_Funcion.buscarMetodo(dato[0]);
                    if (metodo != null)
                    {
                        Variables.pilaAmbito.Push(dato[0]);
                        Variables.nivelAmbito += 1;
                        SegundoRecorrido.action(metodo);
                        Variables.eliminarAmbito();
                    }
                    else
                    {
                        Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                    }
                }
                else if (nodo.ChildNodes.Count == 4)
                {
                    String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[0];
                    ParseTreeNode metodo = null;
                    if (nodo.ChildNodes[2].Term.Name.ToString() == "TipoPARAMETRO")
                    {
                        action(nodo.ChildNodes[2]);
                        metodo = Metodo_Funcion.buscarMetodo(dato[0]);
                        if (metodo != null)
                        {
                            Variables.pilaAmbito.Push(dato[0]);
                            Variables.nivelAmbito += 1;
                            Metodo_Funcion.guardarParametro(dato[0]);
                            SegundoRecorrido.action(metodo);
                            Variables.eliminarAmbito();
                        }
                        else
                        {
                            Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                        }
                    }
                    else
                    {
                        metodo = Metodo_Funcion.buscarMetodo(dato[0]);

                        if (metodo != null)
                        {
                            Variables.pilaAmbito.Push(dato[0]);
                            Variables.nivelAmbito += 1;
                            //  Metodo_Funcion.guardarParametro();
                            SegundoRecorrido.action(metodo);
                            Variables.eliminarAmbito();
                        }
                        else
                        {
                            Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                        }
                    }
                }
                else if (nodo.ChildNodes.Count == 5)
                {
                    String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[0];
                    SegundoRecorrido.action(nodo.ChildNodes[2]);
                    ParseTreeNode metodo = Metodo_Funcion.buscarMetodo(dato[0]);
                    if (metodo != null)
                    {
                        Variables.pilaAmbito.Push(dato[0]);
                        Variables.nivelAmbito += 1;
                        Metodo_Funcion.guardarParametro(dato[0]);
                        SegundoRecorrido.action(metodo);
                        Variables.eliminarAmbito();
                    }
                    else
                    {
                        Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                    }
                }
                Metodo_Funcion.parametrosTemp.Clear();
                result = SegundoRecorrido.retorno;
                SegundoRecorrido.retorno = "";
                break;
            }

            case "TipoPARAMETRO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    result = action(nodo.ChildNodes[0]);
                    String tipo = "";
                    if (PrimerRecorrido.concatenar == true)
                    {
                        tipo = "String";
                    }
                    else         //Number o Bool
                    {
                        if (result == "1" || result == "0")
                        {
                            tipo = "Bool";
                        }
                        else
                        {
                            tipo = "Number";
                        }
                    }
                    Metodo_Funcion.agregarParametroTemp(tipo, result);
                }
                else if (nodo.ChildNodes.Count == 3)
                {
                    action(nodo.ChildNodes[0]);
                    result = action(nodo.ChildNodes[2]);
                    String tipo = "";
                    if (PrimerRecorrido.concatenar == true)
                    {
                        tipo = "String";
                    }
                    else         //Number o Bool
                    {
                        if (result == "1" || result == "0")
                        {
                            tipo = "Bool";
                        }
                        else
                        {
                            tipo = "Number";
                        }
                    }
                    Metodo_Funcion.agregarParametroTemp(tipo, result);
                }
                break;
            }

            case "EXPRESION":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    result = action(nodo.ChildNodes[0]);
                }
                break;
            }

            case "OpARITMETICO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    result = action(nodo.ChildNodes[0]);
                }
                break;
            }

            case "E":
            {
                //    MessageBox.Show("E");
                if (nodo.ChildNodes.Count == 1 || nodo.ChildNodes.Count == 2 || nodo.ChildNodes.Count == 3)
                {
                    result = SegundoRecorrido.resolverOperacion(nodo).ToString();
                }
                break;
            }

            default:
                break;
            }
            return(result);
        }
        public static String action(ParseTreeNode nodo)
        {
            String result = null;

            switch (nodo.Term.Name.ToString())
            {
            case "INICIO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[0]);
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "ENTRADA":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    Variables.pilaAmbito.Push("Global");
                    Variables.nivelAmbito = 0;
                    action(nodo.ChildNodes[0]);
                }
                break;
            }

            case "ENCABEZADO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[0]);
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "C":
                if (nodo.ChildNodes.Count == 2)
                {
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split('('));

                    if (dato[1] == "numero)")
                    {
                        Listas.incerteza = Double.Parse(dato[0]);
                    }
                    else if (dato[1] == "cadena)")
                    {
                        String ruta = dato[0];
                        if (Directory.Exists(ruta))
                        {
                            Listas.ruta = ruta;
                        }
                        else
                        {
                            Reporte.agregarError("No existe ruta: " + ruta, "Error General", 0, 0);
                            //  Listas.ruta = "C:/Users/Aylin/Documents/Visual Studio 2015/Projects/SBScript";
                        }
                    }
                }
                else if (nodo.ChildNodes.Count == 3)
                {
                    Listas.incluir.Push(Listas.archivo.Peek().ToString());
                    Listas.nodoActual = nodo.ChildNodes[0];
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Form1    f    = new Form1();
                    f.incluirArchivo(dato[0] + ".sbs");
                    Listas.incluir.Pop();
                }
                break;

            case "TIPO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    String[] numero = (nodo.ChildNodes.ElementAt(0).ToString().Split(' '));
                    result = numero[0];
                }
                break;
            }

            case "MOSTRAR":
            {
                if (nodo.ChildNodes.Count == 5)
                {
                    Reporte.agregarMensajeError("No puede imprimir en el area de variables globales", "Error Semantico", 0, 0);
                }
                break;
            }

            case "DIBUJAR":
            {
                if (nodo.ChildNodes.Count == 5)
                {
                    //result = action(node.ChildNodes[0]);
                }
                break;
            }

            case "INSTRUCCIONES":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[0]);
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "INSTRUCCION":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    action(nodo.ChildNodes[0]);
                }
                else if (nodo.ChildNodes.Count == 2)
                {
                    //action(node.ChildNodes[0]);
                }
                break;
            }

            case "METODO":
            {
                Metodo_Funcion.parametros.Clear();
                ArrayList lista = new ArrayList();
                if (nodo.ChildNodes.Count == 6)
                {
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[1];
                    Metodo_Funcion.agregarMF("Void", dato[0], "", null, lista);
                }
                else if (nodo.ChildNodes.Count == 7)
                {
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[1];
                    Metodo_Funcion.agregarMF("Void", dato[0], "", nodo.ChildNodes[5], lista);
                }
                else if (nodo.ChildNodes.Count == 8)
                {
                    action(nodo.ChildNodes[3]);
                    Listas.nodoActual = nodo.ChildNodes[1];
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Metodo_Funcion.agregarMF("Void", dato[0], "", nodo.ChildNodes[6], Metodo_Funcion.parametros);
                }
                break;
            }

            case "FUNCION":
            {
                Metodo_Funcion.parametros.Clear();
                ArrayList lista = new ArrayList();
                if (nodo.ChildNodes.Count == 6)
                {
                    String   tipo = action(nodo.ChildNodes[0]);
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[1];
                    Metodo_Funcion.agregarMF(tipo, dato[0], "", null, lista);
                }
                else if (nodo.ChildNodes.Count == 7)
                {
                    String   tipo = action(nodo.ChildNodes[0]);
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Listas.nodoActual = nodo.ChildNodes[1];
                    if (nodo.ChildNodes[3].Term.Name.ToString() == "varPARAMETRO")
                    {
                        action(nodo.ChildNodes[3]);
                        Metodo_Funcion.agregarMF(tipo, dato[0], "", null, Metodo_Funcion.parametros);
                    }
                    else
                    {
                        Metodo_Funcion.agregarMF(tipo, dato[0], "", nodo.ChildNodes[5], lista);
                    }
                }
                else if (nodo.ChildNodes.Count == 8)
                {
                    action(nodo.ChildNodes[3]);
                    String   tipo = action(nodo.ChildNodes[0]);
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Metodo_Funcion.agregarMF(tipo, dato[0], "", nodo.ChildNodes[6], Metodo_Funcion.parametros);
                }

                break;
            }

            case "varPARAMETRO":
            {
                if (nodo.ChildNodes.Count == 2)         //
                {
                    String   t    = action(nodo.ChildNodes[0]);
                    String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' '));
                    Metodo_Funcion.agregarParametro(t, dato[0]);
                }
                else if (nodo.ChildNodes.Count == 4)
                {
                    action(nodo.ChildNodes[0]);
                    String   t    = action(nodo.ChildNodes[2]);
                    String[] dato = (nodo.ChildNodes.ElementAt(3).ToString().Split(' '));
                    Metodo_Funcion.agregarParametro(t, dato[0]);
                }
                break;
            }

            case "RETORNAR":
            {
                // MessageBox.Show("TIPO");
                if (nodo.ChildNodes.Count == 3)
                {
                    action(nodo.ChildNodes[1]);
                }
                break;
            }

            case "MAIN":
            {
                Metodo_Funcion.parametros.Clear();
                ArrayList vacio = new ArrayList();
                if (nodo.ChildNodes.Count == 6)
                {
                    Listas.nodoActual = nodo.ChildNodes[0];
                    if (Listas.incluir.Count == 0)
                    {
                        Metodo_Funcion.agregarMF("MAIN", "MAIN", "", nodo.ChildNodes[4], vacio);
                    }
                }
                break;
            }

            case "LLAMADA":
            {
                if (nodo.ChildNodes.Count == 4)
                {
                    action(nodo.ChildNodes[2]);
                }
                else if (nodo.ChildNodes.Count == 5)
                {
                    result = action(nodo.ChildNodes[2]);
                }
                break;
            }

            case "TipoPARAMETRO":
            {
                if (nodo.ChildNodes.Count == 3)
                {
                }
                break;
            }

            case "SI":
            {
                if (nodo.ChildNodes.Count == 7)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[5]);
                }
                else if (nodo.ChildNodes.Count == 8)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[5]);
                    action(nodo.ChildNodes[7]);
                }
                break;
            }

            case "ELSE":
            {
                if (nodo.ChildNodes.Count == 2)
                {
                    action(nodo.ChildNodes[1]);
                }
                else if (nodo.ChildNodes.Count == 4)
                {
                    action(nodo.ChildNodes[2]);
                }
                break;
            }

            case "CICLO":
            {
                if (nodo.ChildNodes.Count == 7)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[5]);
                }
                break;
            }

            case "SWITCH":
            {
                if (nodo.ChildNodes.Count == 5)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[4]);
                }
                else if (nodo.ChildNodes.Count == 6)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[4]);
                    action(nodo.ChildNodes[5]);
                }
                else if (nodo.ChildNodes.Count == 7)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[5]);
                }
                break;
            }

            case "DEFAULT":
            {
                if (nodo.ChildNodes.Count == 5)
                {
                    action(nodo.ChildNodes[3]);
                }
                break;
            }

            case "FOR":
            {
                if (nodo.ChildNodes.Count == 7)
                {
                    action(nodo.ChildNodes[2]);
                    action(nodo.ChildNodes[5]);
                }
                break;
            }

            case "PARA":
            {
                if (nodo.ChildNodes.Count == 8)
                {
                    action(nodo.ChildNodes[3]);
                    action(nodo.ChildNodes[5]);
                    action(nodo.ChildNodes[7]);
                }
                break;
            }

            case "EXPRESION":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    result = action(nodo.ChildNodes[0]);
                }
                break;
            }

            case "OpARITMETICO":
            {
                if (nodo.ChildNodes.Count == 1)
                {
                    result = action(nodo.ChildNodes[0]);
                }
                break;
            }

            case "E":
            {
                //    MessageBox.Show("E");
                //if (nodo.ChildNodes.Count == 1)
                //{
                //    result = resolverOperacion(nodo).ToString();
                //}
                //else if (nodo.ChildNodes.Count == 3)
                //{
                //    result = resolverOperacion(nodo).ToString();

                //}
                break;
            }

            default:
                break;
            }
            return(result);
        }
Esempio n. 6
0
        public static Boolean crearVariable(String tipo, String nombre, String valor, String ambito)
        {
            ParseTreeNode nodo = Listas.nodoActual;
            Variable      v    = null;

            for (int a = 0; a < listaVariables.Count; a++)
            {
                v = (Variable)listaVariables[a];
                if (v.nombre == nombre && v.tipo == tipo && v.ambito == ambito && v.nivel == nivelAmbito)
                {
                    Reporte.agregarMensajeError("La variable '" + v.nombre + "' ya existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                    return(false);
                }
            }

            if (PrimerRecorrido.concatenar == false)//Numero
            {
                if (tipo == "String")
                {
                    Reporte.agregarMensajeError("Tipo incorrecto: '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                    return(false);
                }
                else if (tipo == "Bool")
                {
                    if (valor == "1")
                    {
                        // valor = "true";
                    }
                    else if (valor == "0")
                    {
                        //valor = "false";
                    }
                    else
                    {
                        Reporte.agregarMensajeError("Tipo Incorrecto '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                        return(false);
                    }
                }
            }
            else //Cadena
            {
                if (tipo == "Number")
                {
                    Reporte.agregarMensajeError("Tipo incorrecto '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                    return(false);
                }
                if (tipo == "Bool")
                {
                    if (!(valor == "1" || valor == "0" || valor == ""))
                    {
                        Reporte.agregarMensajeError("Tipo incorrecto '" + nombre + "'", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                        return(false);
                    }
                }
            }
            Variable nueva = new Variable();

            nueva.tipo   = tipo;
            nueva.nombre = nombre;
            nueva.valor  = valor;
            nueva.ambito = ambito;
            nueva.nivel  = nivelAmbito;
            listaVariables.Add(nueva);
            return(true);
        }
Esempio n. 7
0
        public void incluirArchivo(String archivo)
        {
            int    i       = 0;
            String carpeta = "";

            if (listaRuta.Count == 0)
            {
                Reporte.agregarMensajeError("No se ha podido incluir el archivo ya que no esta guardado", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                return;
            }

            for (i = 0; i < listaRuta.Count; i++) //Si la ruta esta vacia
            {
                Pestania p = (Pestania)listaRuta[i];
                if (p.nombre == nombreTab)
                {
                    carpeta = p.carpeta;
                }
            }

            if (carpeta == "")
            {
                Reporte.agregarMensajeError("No se ha podido incluir el archivo ya que no esta guardado", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                return;
            }
            else
            {
                String ruta  = carpeta + archivo;
                String texto = "";
                try
                {
                    System.IO.StreamReader sr = new System.IO.StreamReader(ruta);
                    ruta  = openFileDialog1.FileName;
                    texto = sr.ReadToEnd();
                    sr.Close();

                    Pestania p = new Pestania();
                    p.nombre  = archivo;
                    p.ruta    = ruta;
                    p.carpeta = carpeta;
                    listaRuta.Add(p);

                    MessageBox.Show(archivo);
                    txtConsola.Text += "\n* * * * * * * * " + archivo + " * * * * * * * ";
                    ParseTreeNode resultado = Analizador.analizar(texto);

                    if (resultado != null)
                    {
                        Listas.archivo.Push(archivo);
                        MessageBox.Show("El arbol fue construido correctamente");
                        PrimerRecorrido.action(resultado);
                        imprimirVariables();
                        imprimir();
                        Listas.archivo.Pop();
                    }
                    else
                    {
                        MessageBox.Show("ERROR: Deberia de revisar la cadena de entrada");
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show("Error;");
                }
            }
        }