public static void agregarMF(String t, String n, String r, ParseTreeNode nodo, ArrayList p)
        {
            Boolean existe = false;

            for (int i = 0; i < listaMetodoFuncion.Count; i++)
            {
                MF m = (MF)listaMetodoFuncion[i];
                if (m.nombre.Equals(n) && p.Count == m.parametro.Count)
                {
                    int cantidad = 0;
                    for (int j = 0; j < p.Count; j++)
                    {
                        Parametro p1 = (Parametro)p[j];
                        Parametro p2 = (Parametro)m.parametro[j];
                        if (p1.nombre == p2.nombre && p1.tipo == p2.tipo)
                        {
                            // existe = true;
                            cantidad += 1;
                        }
                    }
                    if (cantidad == m.parametro.Count)
                    {
                        existe = true;
                    }
                    if (parametros.Count == 0 && m.parametro.Count == 0)
                    {
                        existe = true;
                    }
                }
            }
            if (existe == false)
            {
                MF mf = new MF();
                mf.nombre    = n;
                mf.tipo      = t;
                mf.retorno   = r;
                mf.nodo      = nodo;
                mf.parametro = (ArrayList)parametros.Clone();
                listaMetodoFuncion.Add(mf);
            }
            else
            {
                Reporte.agregarError("Ya existe un metodo o funcion llamada " + n, "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column);
                Listas.MensajeConsola.Add("> Ya existe un metodo o funcion llamada " + n + "\n");
            }
        }
Beispiel #2
0
        public static ParseTreeNode analizar(String cadena)
        {
            Gramatica gramatica = new Gramatica();

            LanguageData lenguaje = new LanguageData(gramatica);
            Parser       parser   = new Parser(lenguaje);
            //  MessageBox.Show("parser"); //Error de Gramatica
            ParseTree     arbol = parser.Parse(cadena);
            ParseTreeNode raiz  = arbol.Root;

            //foreach (var item in  arbol.ParserMessages)
            //{
            //   // Irony.LogMessage log = arbol.ParserMessages[item];
            //    //log.Location.Line.ToString();
            //}
            for (int i = 0; i < arbol.ParserMessages.Count; i++)
            {
                Irony.LogMessage log     = arbol.ParserMessages[i];
                String[]         dato    = log.Level.ToString().Split(':');
                String           tipo    = "";
                String           mensaje = log.Message.ToString();
                if (dato[0] == "Invalid character")
                {
                    tipo    = "Error Lexico";
                    mensaje = mensaje.Replace("Invalid character", "Caracter invalido:");
                }
                else
                {
                    tipo    = "Error Sintactico";
                    mensaje = mensaje.Replace("Syntax error, expected:", "Se esperaba:");
                }
                Reporte.agregarError(mensaje, tipo, log.Location.Line, log.Location.Column);
            }
            if (raiz == null)
            {
                return(raiz);
            }
            else
            {
                generarArbol(raiz);
                return(raiz);
            }
        }
Beispiel #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;

            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);
        }