示例#1
0
        public bool verificarSintaxis(RichTextBox txtLog)
        {
            bool                    comprobante = true;
            List <String>           pila        = new List <String>();
            TablaAnalisisSintactico tas         = new TablaAnalisisSintactico();
            IdentificadoresTabla    find        = new IdentificadoresTabla();

            pila.Add("$");
            pila.Add("Codigo");

            do
            {
                Console.WriteLine("------------------------------------------------------");
                foreach (String element in pila)
                {
                    Console.Write("  " + element);
                }
                Console.WriteLine();
                foreach (String element in entrada)
                {
                    Console.Write("  " + element);
                }

                //si los ultimos elementos de ambas listas son iguales, se eliminan
                if (pila[pila.Count - 1].Equals(entrada[entrada.Count - 1]))
                {
                    pila.RemoveAt(pila.Count - 1);
                    entrada.RemoveAt(entrada.Count - 1);
                }
                else if (pila[pila.Count - 1].Equals("e"))
                {
                    pila.RemoveAt(pila.Count - 1);
                }
                else //Se busca en la tabla los reemplazos para el último en la pila
                {
                    String noTerminal = pila[pila.Count - 1];
                    pila.RemoveAt(pila.Count - 1);
                    int cont = 0;

                    int fila    = Array.IndexOf(find.Fila, noTerminal);
                    int columna = Array.IndexOf(find.Columna, entrada[entrada.Count - 1]);
                    //Console.WriteLine("\n\nFila: " + fila + "   Columna: " + columna);
                    try
                    {
                        foreach (String element in tas.Tabla[fila, columna])
                        {
                            pila.Add(element);
                            cont++;
                        }
                    }
                    catch (IndexOutOfRangeException ex)
                    {
                        comprobante = false;
                    }

                    if (cont == 0)
                    {
                        comprobante = false;
                    }
                }

                Console.WriteLine("\n\n");
            } while (pila.Count != 0 && comprobante);

            //Si la pila o la entrada no están vacías quiere decir que el análisis sintáctico no fue satisfactorio
            if (pila.Count != 0 || entrada.Count != 0)
            {
                comprobante = false;
                Console.WriteLine("Hay errores sintácticos en el análisis");
                txtLog.AppendText(Environment.NewLine + "Error Sintáctico en: (" + informacion[entrada.Count - 2].Fila + "," + informacion[entrada.Count - 2].Columna + ")");
            }

            return(comprobante);
        }
示例#2
0
        public String dotCode()
        {
            String codigo = "graph arbolSintactico { graph [ordering=\"out\"];";

            bool                    comprobante  = true;
            List <String>           pila         = new List <String>();
            List <Nodo>             nodosActivos = new List <Nodo>();
            int                     contNodo     = 0;
            TablaAnalisisSintactico tas          = new TablaAnalisisSintactico();
            IdentificadoresTabla    find         = new IdentificadoresTabla();

            pila.Add("$");
            pila.Add("Codigo");
            nodosActivos.Add(new Nodo("Codigo", 0));
            codigo += " Nodo0[shape=circle,label=\"Codigo\"]; ";

            do
            {
                Console.WriteLine("------------------------------------------------------");
                foreach (String element in pila)
                {
                    Console.Write("  " + element);
                }
                Console.WriteLine();
                foreach (String element in entrada)
                {
                    Console.Write("  " + element);
                }

                //si los ultimos elementos de ambas listas son iguales, se eliminan
                if (pila[pila.Count - 1].Equals(entrada[entrada.Count - 1]))
                {
                    pila.RemoveAt(pila.Count - 1);
                    entrada.RemoveAt(entrada.Count - 1);
                    if (nodosActivos.Count > 0)
                    {
                        nodosActivos.RemoveAt(nodosActivos.Count - 1);
                    }
                }
                else if (pila[pila.Count - 1].Equals("e"))
                {
                    pila.RemoveAt(pila.Count - 1);
                    nodosActivos.RemoveAt(nodosActivos.Count - 1);
                }
                else //Se busca en la tabla los reemplazos para el último en la pila
                {
                    String noTerminal = pila[pila.Count - 1];
                    pila.RemoveAt(pila.Count - 1);
                    int cont = 0, contNodoAux = nodosActivos[nodosActivos.Count - 1].Numero;


                    int fila    = Array.IndexOf(find.Fila, noTerminal);
                    int columna = Array.IndexOf(find.Columna, entrada[entrada.Count - 1]);
                    try
                    {
                        foreach (String element in tas.Tabla[fila, columna])
                        {
                            contNodo++;

                            pila.Add(element);
                            nodosActivos.Add(new Nodo(element, contNodo));
                            codigo += " \nNodo" + contNodo + "[shape=circle,label=\"" + element + "\"]; \nNodo" + contNodoAux + " -- Nodo" + contNodo + "; ";
                            cont++;
                        }

                        nodosActivos.RemoveAt(contNodoAux);
                    }
                    catch (Exception ex)
                    {
                    }
                }

                Console.WriteLine("\n\n");
            } while (pila.Count != 0 && comprobante);

            codigo += "\n}";

            return(codigo);
        }