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);
        }
示例#2
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;");
                }
            }
        }
示例#3
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);
        }
示例#4
0
 private void btnReporte_Click(object sender, EventArgs e)
 {
     Reporte.generarReporte();
 }