Пример #1
0
        //FINALIZA LA PARTE DEL MENU ARCHIVO

        private void analizarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string linea = "";

            //if(textBox.Lines)
            if (textBox.Lines.Count() > 0)
            {
                for (int i = 0; i < textBox.Lines.Count(); i++)
                {
                    //linea = textBox.Lines[i];
                    string[] partir = textBox.Lines[i].Split(' ');
                    //Console.WriteLine("Lineas : " + textBox.Lines.Count());
                    linea = AnalizadorLexico.analizarTokens(partir);
                    Console.WriteLine(linea);
                }
                //if()
                //              Console.WriteLine("Linea : " + linea);
//                AnalizadorLexico.analizarTokens(linea);
            }
        }
Пример #2
0
        public ComponenteLexico Analizar(bool depurar, bool Metodo)
        {
            AnaLex          = new AnalizadorLexico();
            this.Metodo     = Metodo;
            TrazaDerivacion = new StringBuilder();

            if (this.Metodo)
            {
                Avanzar();
                Morse();
            }
            else
            {
                Avanzar();
                Latin();
            }


            return(Componente);
        }
Пример #3
0
        private void ChequearTokensRepetidosEnCadena(Terminal term)
        {
            if (CadenaEntrada.TieneTerminalRepetidoEnPrimerLugarErroneo(cantParentesisAbiertos))
            {
                if (term.Equals(Terminal.ElementoParentesisClausura()))
                {
                    //Le sumo uno asi restauro el equilibrio
                    cantParentesisAbiertos++;
                }
                StringBuilder strbldr = new StringBuilder("Se encontro ");
                strbldr.Append(EnumUtils.stringValueOf(term.Componente.Token));
                strbldr.Append(" repetido.");

                throw new ErrorSintacticoException(strbldr.ToString(),
                                                   AnalizadorLexico.FilaActual(),
                                                   AnalizadorLexico.ColumnaActual(),
                                                   false,
                                                   true,
                                                   false);
            }
        }
Пример #4
0
        private void cargarInfoConsola_Click(object sender, EventArgs e)
        {
            String[] lineasEntradas = entradaDatosConsola.Lines;
            String[] lineasSalidas  = lineasEntradas;
            for (int i = 0; i < lineasEntradas.Length; i++)
            {
                lineasSalidas[i] = i + " -> " + lineasEntradas[i];
            }
            salidaDatos.Lines = lineasSalidas;
            Resetear();
            for (int i = 0; i < lineasEntradas.Count(); i++)
            {
                Linea.Crear(i + 1, lineasEntradas[i]);
            }
            try
            {
                AnalizadorLexico analizador = new AnalizadorLexico();
                ComponenteLexico componente = analizador.Analizar();
                while (!componente.ObtenerCategoria().Equals(Categoria.FIN_DE_ARCHIVO))
                {
                    MessageBox.Show(componente.ToString());

                    componente = analizador.Analizar();
                }
                if (ManejadorErrores.HayErrores())
                {
                    MessageBox.Show("El proceso de compilacion ha finalizado con errores");
                }
                else
                {
                    MessageBox.Show("El proceso de compilacion ha finalizado exitosamente");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            salidaDatos.Lines = lineasSalidas.ToArray();
        }
Пример #5
0
        private void AnalizarLugarDeLaPilaYDescartarHastaTerminalQueCorresponda(NoTerminal nt, Terminal t, bool generaProdVacia)
        {
            Terminal termBuscar = BuscarTerminalApropiadoBasadoEnTopePila(nt);

            //string error = CaptarMensajeErrorApropiado(nt, t);

            Produccion prod = tabla.BuscarEnTablaProduccion(nt, termBuscar, false, generaProdVacia);

            if (prod != null)
            {
                StringBuilder strbldr = new StringBuilder(string.Empty);
                strbldr.Append("Se esperaba ");
                strbldr.Append(termBuscar.Componente.Lexema);

                throw new ErrorSintacticoException(strbldr.ToString(),
                                                   AnalizadorLexico.FilaActual(),
                                                   AnalizadorLexico.ColumnaActual(),
                                                   true,
                                                   false,
                                                   true,
                                                   true,
                                                   termBuscar
                                                   );
            }
            else
            {
                StringBuilder strbldr = new StringBuilder(string.Empty);
                strbldr.Append(EnumUtils.stringValueOf(t.Componente.Token));
                strbldr.Append(" no tiene lugar en la sentencia.");

                throw new ErrorSintacticoException(strbldr.ToString(),
                                                   AnalizadorLexico.FilaActual(),
                                                   AnalizadorLexico.ColumnaActual(),
                                                   false,
                                                   true,
                                                   false);
            }
        }
Пример #6
0
        public async Task <string> Compilar()
        {
            await Task.Yield();

            this.ResultadosCompilacion.Clear();
            //try
            //{
            //Fase 1 Analisis Lexico
            Analizador analizador
                = new AnalizadorLexico(this.Document, this.ResultadosCompilacion);

            analizador.Analizar();
            if (analizador.EsValido)
            {
                //Fase 2 Analisis Sintactico
                analizador =
                    new AnalizadorSintactico((AnalizadorLexico)analizador, this.Document, this.ResultadosCompilacion);
                analizador.Analizar();
                if (analizador.EsValido)
                {
                    //        //Fase 4 Sintetizador
                    analizador =
                        new Sintesis((AnalizadorSintactico)analizador, this.Document, this.ResultadosCompilacion);
                    analizador.Analizar();
                    if (analizador.EsValido)
                    {
                        CodigoMaquina maquina = new CodigoMaquina((Sintesis)analizador);
                        maquina.Generar();
                        this.CodigoMaquina = maquina.Codigo;
                        this.Compilado     = true;
                        this.CodeSegment   = maquina.CodeSegment;
                        return("Compilación exitosa");
                    }
                }
            }
            this.Compilado = false;
            return("Se encontrarón errores previos a la compilación\n");
        }
Пример #7
0
 public AnalizadorSintactico(AnalizadorLexico Lexica, TextDocument Documento, ResultadosCompilacion Errores) : base(Documento, Errores)
 {
     this.Lexica      = Lexica;
     this.CodeSegment = new CodeSegment();
 }
Пример #8
0
 public AnalizadorSintactico(string src)
 {
     this.source = src;
     al          = new AnalizadorLexico(this.source);
 }
Пример #9
0
 internal void CargarAnalizadorLexicografico(string texto)
 {
     AnalizadorLexico.CargarTexto(texto);
 }
Пример #10
0
        private void RellenarCadenaEntrada()
        {
            if (!finArch)
            {
                Terminal t = Terminal.ElementoVacio();

                while ((CadenaEntrada.Count < cantElementosCadenaEntrada) && (!t.Equals(Terminal.ElementoEOF())))
                {
                    t            = new Terminal();
                    t.Componente = AnalizadorLexico.ObtenerProximoToken();

                    //Controlo que no haya un error lexico en el token que acabo de traer.
                    //Si hay error directamente me salteo el paso, no se inserta en la cadena, y no toco la pila.
                    if (t.Equals(Terminal.ElementoError()))
                    {
                        //throw new ErrorLexicoException(string.Format("El caracter {0} no es reconocido por el lenguaje GarGar", t.Componente.Lexema), t.Componente.Fila, t.Componente.Columna);
                        string lexemaError;
                        if (string.IsNullOrEmpty(t.Componente.CaracterErroneo))
                        {
                            lexemaError = t.Componente.Lexema.Split(new char[] { ' ' })[0];
                        }
                        else
                        {
                            lexemaError = t.Componente.CaracterErroneo;
                        }

                        string errorMensaje = string.Format("El caracter {0} es invalido en este contexto", lexemaError);

                        if (t.Componente.Descripcion != null)
                        {
                            errorMensaje = t.Componente.Descripcion;
                        }

                        throw new ErrorLexicoException(errorMensaje, t.Componente.Fila, t.Componente.Columna);
                    }

                    if (t.Componente.Token == ComponenteLexico.TokenType.Numero)
                    {
                        if (t.Componente.Lexema.TrimStart()[0] == '-')
                        {
                            Terminal ultimoTerminal = CadenaEntrada.UltimoTerminalInsertado;

                            if (ultimoTerminal != null && TerminalesHelpers.EsTerminalConValor(ultimoTerminal))
                            {
                                //Para que no de error Sintactico, creo este otro token para que parezca que es una operacion negativa -

                                ComponenteLexico comp = new ComponenteLexico();
                                comp.Fila    = t.Componente.Fila;
                                comp.Columna = t.Componente.Columna;
                                comp.Lexema  = "-";
                                comp.Token   = ComponenteLexico.TokenType.RestaEntero;

                                CadenaEntrada.InsertarTerminal(new Terminal()
                                {
                                    Componente = comp
                                });

                                //Le sumo uno pq el menos ya no pertenece mas.
                                t.Componente.Columna++;

                                //Le saco el - del lexema
                                t.Componente.Lexema = t.Componente.Lexema.Remove(0, 1);
                            }
                        }
                    }



                    CadenaEntrada.InsertarTerminal(t);
                }
                if (t.Equals(Terminal.ElementoEOF()))
                {
                    finArch = true;
                }
            }
        }
Пример #11
0
        internal List <ErrorCompilacion> AnalizarUnSoloPaso()
        {
            List <ErrorCompilacion> retorno = new List <ErrorCompilacion>();

            if (!(CadenaEntrada.EsFinDeCadena() && Pila.EsFinDePila()))
            {
                RellenarCadenaEntrada();

                if (Pila.ObtenerTope().GetType() == typeof(Terminal))
                {
                    Terminal term = (Terminal)Pila.ObtenerTope();

                    if (CadenaEntrada.ObtenerPrimerTerminal().Equals(Pila.ObtenerTope()))
                    {
                        if (term.Componente.Token == ComponenteLexico.TokenType.ParentesisApertura)
                        {
                            cantParentesisAbiertos++;
                        }
                        else if (term.Componente.Token == ComponenteLexico.TokenType.ParentesisClausura)
                        {
                            cantParentesisAbiertos--;
                        }

                        //flanzani 8/1/2012
                        //tokens repetidos
                        //Antes de pasar por el semantico, lo que hago es fijarme si el terminal justo no esta repetido,
                        //pq eso me caga todo el parseo de errores del sintactico
                        //Esto puede arrojar una excepcion sintactica
                        ChequearTokensRepetidosEnCadena(term);

                        if (HabilitarSemantico)
                        {
                            retorno = ArbolSemantico.CalcularAtributos(CadenaEntrada.ObtenerPrimerTerminal());
                        }

                        Pila.DescartarTope();

                        GlobalesCompilador.UltFila = CadenaEntrada.ObtenerPrimerTerminal().Componente.Fila;
                        GlobalesCompilador.UltCol  = CadenaEntrada.ObtenerPrimerTerminal().Componente.Columna;

                        EstadoSintactico.AgregarTerminal(term);

                        CadenaEntrada.EliminarPrimerTerminal();
                    }
                    else
                    {
                        if (term.NoEsLambda())
                        {
                            StringBuilder strbldr = new StringBuilder(string.Empty);
                            strbldr.Append("Se esperaba ");
                            strbldr.Append(EnumUtils.stringValueOf(term.Componente.Token));
                            strbldr.Append(" pero se encontro ");
                            strbldr.Append(EnumUtils.stringValueOf(CadenaEntrada.ObtenerPrimerTerminal().Componente.Token));
                            strbldr.Append(".");

                            if (term.Equals(Terminal.ElementoFinSentencia()))
                            {
                                //Descarto el ; de la pila pq asumo que simplemente se le olvido
                                strbldr.Append(" Se asume fin de sentencia para continuar con analisis.");
                            }

                            throw new ErrorSintacticoException(strbldr.ToString(),
                                                               AnalizadorLexico.FilaActual(),
                                                               AnalizadorLexico.ColumnaActual(),
                                                               true,
                                                               false,
                                                               false);
                        }
                        else
                        {
                            retorno = AnalizarPila();
                        }
                    }
                }
                else
                {
                    retorno = AnalizarPila();
                }
            }

            return(retorno);
        }
Пример #12
0
        private void aNALIZARToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (escritorsql.TEXTO() != null)
                {
                    String miText = escritorsql.TEXTO();
                    if (escritorsql.TEXTOSELECCIONADO().Length > 0)
                    {
                        miText = escritorsql.TEXTOSELECCIONADO();
                    }
                    AnalizadorLexico lexico = new AnalizadorLexico();
                    //AnalizadorSintactico sintaxis = new AnalizadorSintactico();
                    tokens         = lexico.ObtenerTokens(miText);
                    tokensAnalizar = lexico.tokensAnalizar;
                    errores        = lexico.Errores;
                    Console.WriteLine("\n tama;o de tokens analizar " + tokensAnalizar.Count);
                    if (errores.Count() > 0)
                    {
                        vERTABLASToolStripMenuItem.Enabled = false;
                    }
                    else
                    {
                        vERTABLASToolStripMenuItem.Enabled = true;
                    }

                    for (int i = 0; i < tokens.Count(); i++)
                    {
                        Token miToken = tokens[i];
                        Console.WriteLine("Lexema: " + miToken.Lexema + " Token: " + miToken.Token1 + " Tipo: " + miToken.Tipo + "  Color" + miToken.Color + "  Fila" + miToken.Fila + "  Columna" + miToken.Columna);
                    }
                    Console.WriteLine("\n ========iniciando analizador sintactico=============");
                    AnalizadorSintactico sintactico = new AnalizadorSintactico(tokensAnalizar);
                    sintactico.Tablas = tablas;
                    sintactico.analizar();
                    erroresSintacticos = sintactico.Errores;
                    escritorsql.InsertarErrores(erroresSintacticos);
                    Arbol arbol = new Arbol();
                    arbol.ImprimirNodos(sintactico.Principal, 1);

                    graficador.Raiz = sintactico.Principal;
                    // tokensAnalizar.Clear();
                    escritorsql.InsertarTexto(lexico.TokensArchivo);
                    if (erroresSintacticos.Count > 0 || errores.Count > 0)
                    {
                        vERTABLASToolStripMenuItem.Enabled = false;
                        bntArbol.Enabled = false;
                    }
                    else
                    {
                        vERTABLASToolStripMenuItem.Enabled = true;
                        bntArbol.Enabled = true;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Debe Cargar un archivo primero");
                Console.WriteLine(ex);
            }
        }