Exemplo n.º 1
0
        private void btnEjecutar_Click(object sender, EventArgs e)
        {
            Limpiar();
            Listas.archivo.Clear();
            String nombre = tabControl1.SelectedTab.AccessibilityObject.Name.ToString();

            Listas.archivo.Push(nombre);
            nombreTab = nombre;
            var           rich      = (RichTextBox)tabControl1.TabPages[tabControl1.SelectedIndex].Controls[0];
            ParseTreeNode resultado = Analizador.analizar(rich.Text);

            if (resultado != null)
            {
                MessageBox.Show("El arbol fue construido correctamente");
                PrimerRecorrido.action(resultado);
                RecorridoGlobal.action(resultado);
                ParseTreeNode nodoPrincipal = Metodo_Funcion.buscarMetodo("MAIN");
                if (nodoPrincipal != null)
                {
                    Variables.pilaAmbito.Push("Principal");
                    Variables.nivelAmbito     += 1;
                    SegundoRecorrido.continuar = false;
                    SegundoRecorrido.detener   = false;
                    SegundoRecorrido.retornar  = false;
                    SegundoRecorrido.action(nodoPrincipal);
                }
                imprimirVariables();
                imprimir();
            }
            else
            {
                MessageBox.Show("ERROR: Deberia de revisar la cadena de entrada");
            }
        }
        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);
        }