Beispiel #1
0
        private void ChequearErrorCierreBloqueIncorrecta(Terminal terminal, ContextoGlobal contextoGlobal)
        {
            MensajeError mensajeError = null;

            if (contextoGlobal == ContextoGlobal.Cuerpo)
            {
                switch (terminal.Componente.Token)
                {
                case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MientrasFin:
                    if (EstadoSintactico.TopePilaLlamados != ElementoPila.Mientras)
                    {
                        mensajeError = new ErrorCierreMientrasFueraLugar(EstadoSintactico.TopePilaLlamados.ToString());
                    }
                    break;

                case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SiSino:
                    if (EstadoSintactico.TopePilaLlamados != ElementoPila.Si)
                    {
                        mensajeError = new ErrorSinoFueraLugar(EstadoSintactico.TopePilaLlamados.ToString());
                    }
                    break;

                case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SiFin:
                    if (EstadoSintactico.TopePilaLlamados != ElementoPila.Si && EstadoSintactico.TopePilaLlamados != ElementoPila.Sino)
                    {
                        mensajeError = new ErrorCierreSiFueraLugar(EstadoSintactico.TopePilaLlamados.ToString());
                    }
                    break;

                case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ProcedimientoFin:
                    if (EstadoSintactico.TopePilaLlamados != ElementoPila.Procedimiento)
                    {
                        mensajeError = new ErrorCierreProcFueraLugar(EstadoSintactico.TopePilaLlamados.ToString());
                    }
                    break;

                case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.FuncionFin:
                    if (EstadoSintactico.TopePilaLlamados != ElementoPila.Funcion)
                    {
                        mensajeError = new ErrorCierreFuncFueraLugar(EstadoSintactico.TopePilaLlamados.ToString());
                    }
                    break;

                default:
                    break;
                }

                if (mensajeError != null)
                {
                    throw new AnalizadorErroresException(mensajeError)
                          {
                              Fila = terminal.Componente.Fila, Columna = terminal.Componente.Columna, Parar = true
                          };
                }
            }
        }
Beispiel #2
0
        internal static void Reiniciar()
        {
            listaLeidoHastaAhora.Clear();
            listaLineaActual.Clear();
            contextoGlobal = Sintactico.ContextoGlobal.Global;
            contextoLinea  = Sintactico.ContextoLinea.Ninguno;


            esProcPrincipal = false;
        }
        private static bool ChequeoLineasFueraContexto(List <Terminal> linea, ContextoGlobal contextoGlobal, List <Terminal> cadenaEntradaFaltante)
        {
            if (linea.Count == 0)
            {
                ContextoLinea cont = EstadoSintactico.ContextoPerteneceTerminal(cadenaEntradaFaltante[0]);

                return(EstadoSintactico.EsContextoLineaCorrectoParaGlobal(cont, contextoGlobal, cadenaEntradaFaltante[0]));
            }
            else
            {
                return(false);
            }
        }
Beispiel #4
0
        public AnalizadorErroresSintacticos(List <Terminal> lineaHastaAhora, ContextoGlobal contextoGlobal, ContextoLinea contextoLinea, List <Terminal> cadenaEntradaFaltante)
        {
            if (TerminalesHelpers.EsTerminalFinBloque(cadenaEntradaFaltante[0]) && lineaHastaAhora.Count == 0)
            {
                ChequearErrorCierreBloqueIncorrecta(cadenaEntradaFaltante[0], contextoGlobal);
            }


            tipoError = TipoFactory.CrearTipo(lineaHastaAhora, contextoGlobal, contextoLinea, cadenaEntradaFaltante);

            if (tipoError == null)
            {
                ConstruirYArrojarExcepcion(cadenaEntradaFaltante[0], contextoGlobal);
            }
        }
Beispiel #5
0
        internal static bool EsContextoLineaCorrectoParaGlobal(ContextoLinea linea, ContextoGlobal global, Terminal t)
        {
            switch (global)
            {
            case ContextoGlobal.Global:
                return(linea == Sintactico.ContextoLinea.DeclaracionFuncion ||
                       linea == Sintactico.ContextoLinea.DeclaracionProc ||
                       (linea == Sintactico.ContextoLinea.Ninguno && t.Componente.Token == Lexicografico.ComponenteLexico.TokenType.Variables) ||
                       (linea == Sintactico.ContextoLinea.Ninguno && t.Componente.Token == Lexicografico.ComponenteLexico.TokenType.Constantes));

            case ContextoGlobal.GlobalDeclaracionesConstantes:
                return(linea == Sintactico.ContextoLinea.DeclaracionFuncion ||
                       linea == Sintactico.ContextoLinea.DeclaracionProc ||
                       linea == Sintactico.ContextoLinea.DeclaracionConstante ||
                       linea == Sintactico.ContextoLinea.DeclaracionVariable ||
                       (linea == Sintactico.ContextoLinea.Ninguno && t.Componente.Token == Lexicografico.ComponenteLexico.TokenType.Variables));

            case ContextoGlobal.GlobalDeclaracionesVariables:
                return(linea == Sintactico.ContextoLinea.DeclaracionFuncion ||
                       linea == Sintactico.ContextoLinea.DeclaracionProc ||
                       linea == Sintactico.ContextoLinea.DeclaracionConstante ||
                       linea == Sintactico.ContextoLinea.DeclaracionVariable);

            case ContextoGlobal.DeclaracionLocal:
                return(linea == Sintactico.ContextoLinea.DeclaracionConstante ||
                       linea == Sintactico.ContextoLinea.DeclaracionVariable ||
                       (linea == Sintactico.ContextoLinea.Ninguno && t.Componente.Token == Lexicografico.ComponenteLexico.TokenType.Comenzar));

            case ContextoGlobal.Cuerpo:
                return(linea == Sintactico.ContextoLinea.Mientras ||
                       linea == Sintactico.ContextoLinea.FinMientras ||
                       linea == Sintactico.ContextoLinea.Si ||
                       linea == Sintactico.ContextoLinea.Sino ||
                       linea == Sintactico.ContextoLinea.FinSi ||
                       linea == Sintactico.ContextoLinea.Leer ||
                       linea == Sintactico.ContextoLinea.LlamadaProc ||
                       linea == Sintactico.ContextoLinea.Mostrar);

            default:
                return(false);
            }
        }
Beispiel #6
0
        private void ConstruirYArrojarExcepcion(Terminal terminal, ContextoGlobal contextoGlobal)
        {
            MensajeError mensajeError;


            ContextoLinea cont = EstadoSintactico.ContextoPerteneceTerminal(terminal);

            switch (cont)
            {
            case ContextoLinea.Asignacion:
                mensajeError = new ErrorVariableSinLugarEnAsignacion(terminal.Componente.Lexema);
                break;

            case ContextoLinea.Leer:
                mensajeError = new ErrorLeerFueraDeLugar();
                break;

            case ContextoLinea.LlamadaProc:
                mensajeError = new ErrorLlamadaProcFueraLugar();
                break;

            case ContextoLinea.Mientras:
                mensajeError = new ErrorBloqueMientrasFueraLugar();
                break;

            case ContextoLinea.Si:
                mensajeError = new ErrorBloqueSiFueraLugar();
                break;

            case ContextoLinea.Sino:
                mensajeError = new ErrorBloqueSinoFueraLugar();
                break;

            case ContextoLinea.DeclaracionFuncion:
                mensajeError = new ErrorDeclaracionFuncionFueraLugar();
                break;

            case ContextoLinea.DeclaracionProc:
                mensajeError = new ErrorDeclaracionProcFueraLugar();
                break;

            case ContextoLinea.DeclaracionConstante:
                switch (contextoGlobal)
                {
                case ContextoGlobal.GlobalDeclaracionesVariables:
                    mensajeError = new ErrorDeclaracionConstanteFueraLugarEnVariables();
                    break;

                case ContextoGlobal.DeclaracionLocal:
                    mensajeError = new ErrorDeclaracionConstanteFueraLugarEnEspacioDecLocal();
                    break;

                case ContextoGlobal.Cuerpo:
                    mensajeError = new ErrorDeclaracionConstanteFueraLugarCuerpoProc();
                    break;

                default:
                    mensajeError = new ErrorDeclaracionConstanteFueraLugar2();
                    break;
                }
                break;

            case ContextoLinea.DeclaracionVariable:
                switch (contextoGlobal)
                {
                case ContextoGlobal.GlobalDeclaracionesConstantes:
                    mensajeError = new ErrorDeclaracionVariableFueraLugarConstantes();
                    break;

                case ContextoGlobal.Cuerpo:
                    mensajeError = new ErrorDeclaracionVariableFueraLugarCuerpo();
                    break;

                default:
                    mensajeError = new ErrorDeclaracionVariableFueraLugar2();
                    break;
                }
                break;

            case ContextoLinea.FinFuncion:
                mensajeError = new ErrorFinFuncFueraLugar();
                break;

            case ContextoLinea.FinProc:
                mensajeError = new ErrorFinProcFueraLugar();
                break;

            case ContextoLinea.FinMientras:
                mensajeError = new ErrorFinMientrasFueraLugar();
                break;

            case ContextoLinea.FinSi:
                mensajeError = new ErrorFinSiFueraLugar();
                break;

            case ContextoLinea.Mostrar:
                mensajeError = new ErrorMostrarFueraLugar();
                break;

            default:
                mensajeError = new ErrorLineaComienzaIncorrecta(terminal.Componente.Lexema);
                break;
            }

            throw new AnalizadorErroresException(mensajeError)
                  {
                      Fila = terminal.Componente.Fila, Columna = terminal.Componente.Columna, Parar = true
                  };
        }
        private static Tipos.TipoBase Crear(List <Terminal> lineaEntera, List <Terminal> lineaHastaAhora, ContextoGlobal contextoGlobal, ContextoLinea tipo, int fila, int col)
        {
            Tipos.TipoBase retorno = null;

            switch (tipo)
            {
            case ContextoLinea.Asignacion:
                retorno = new Tipos.Asignacion(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.Leer:
                retorno = new Tipos.Leer(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.LlamadaProc:
                retorno = new Tipos.LlamadoProc(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.Mientras:
                retorno = new Tipos.Mientras(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.Si:
                retorno = new Tipos.Si(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.Sino:
                break;

            case ContextoLinea.DeclaracionFuncion:
                retorno = new Tipos.DeclaracionFuncion(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.DeclaracionProc:
                retorno = new Tipos.DeclaracionProc(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.DeclaracionConstante:
                retorno = new Tipos.DeclaracionConstante(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.DeclaracionVariable:
                retorno = new Tipos.DeclaracionVariable(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.FinFuncion:
                retorno = new Tipos.FinFuncion(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.FinProc:
                retorno = new Tipos.FinProc(lineaEntera, lineaHastaAhora, fila, col);     //terminada 16/3/2012
                break;

            case ContextoLinea.FinMientras:
                retorno = new Tipos.FinMientras(lineaEntera, lineaHastaAhora, fila, col);     //terminada 16/3/2012
                break;

            case ContextoLinea.FinSi:
                retorno = new Tipos.FinSi(lineaEntera, lineaHastaAhora, fila, col);    //terminada 16/3/2012
                break;

            case ContextoLinea.Mostrar:
                retorno = new Tipos.Mostrar(lineaEntera, lineaHastaAhora, fila, col);
                break;

            case ContextoLinea.Ninguno:
                break;

            default:
                break;
            }


            return(retorno);
        }
        internal static Tipos.TipoBase CrearTipo(List <Terminal> lineaHastaAhora, ContextoGlobal contextoGlobal, ContextoLinea tipo, List <Terminal> cadenaEntradaFaltante)
        {
            int fila, col;

            if (cadenaEntradaFaltante.Count > 0)
            {
                fila = cadenaEntradaFaltante[0].Componente.Fila;
                col  = cadenaEntradaFaltante[0].Componente.Columna;
            }
            else
            {
                if (lineaHastaAhora.Count > 0)
                {
                    fila = lineaHastaAhora[lineaHastaAhora.Count - 1].Componente.Fila;
                    col  = lineaHastaAhora[lineaHastaAhora.Count - 1].Componente.Columna;
                }
                else
                {
                    fila = -1;
                    col  = -1;
                }
            }

            bool errorLineaFueraContextoGlobal = false;

            List <Terminal> lineaEntera = new List <Terminal>(lineaHastaAhora);

            List <Terminal> terminalesQueTerminanLinea = new List <Terminal>();
            List <Terminal> terminalesQueIndicanComienzoOtraSentencia = new List <Terminal>();

            //Estos son comunes a todos. Algunos tienen alguno mas.
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoSi());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoMientras());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoFuncion());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoLlamar());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoVar());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoConst());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoMostrar());
            terminalesQueIndicanComienzoOtraSentencia.Add(Terminal.ElementoMostrarP());
            switch (tipo)
            {
            case ContextoLinea.Asignacion:
            case ContextoLinea.Leer:
            case ContextoLinea.LlamadaProc:
            case ContextoLinea.DeclaracionConstante:
            case ContextoLinea.DeclaracionVariable:
            case ContextoLinea.Mostrar:
            case ContextoLinea.FinProc:
            case ContextoLinea.FinFuncion:
            case ContextoLinea.FinSi:
            case ContextoLinea.FinMientras:
                terminalesQueTerminanLinea.Add(Terminal.ElementoFinSentencia());


                break;

            case ContextoLinea.Mientras:
                terminalesQueTerminanLinea.Add(Terminal.ElementoHacer());

                break;

            case ContextoLinea.Si:
                terminalesQueTerminanLinea.Add(Terminal.ElementoEntonces());


                break;

            case ContextoLinea.DeclaracionFuncion:
                terminalesQueTerminanLinea.Add(Terminal.ElementoTipoBooleano());
                terminalesQueTerminanLinea.Add(Terminal.ElementoTipoNumero());
                terminalesQueTerminanLinea.Add(Terminal.ElementoTipoTexto());


                break;

            case ContextoLinea.DeclaracionProc:
                terminalesQueTerminanLinea.Add(Terminal.ElementoParentesisClausura());
                break;

            case ContextoLinea.Ninguno:
                //Es el primer terminal se una linea fuera de contexto
                errorLineaFueraContextoGlobal = ChequeoLineasFueraContexto(lineaHastaAhora, contextoGlobal, cadenaEntradaFaltante);
                break;
            }

            if (!errorLineaFueraContextoGlobal)
            {
                int i = 0;
                while (i < cadenaEntradaFaltante.Count &&
                       !terminalesQueTerminanLinea.Contains(cadenaEntradaFaltante[i]) &&
                       !terminalesQueIndicanComienzoOtraSentencia.Contains(cadenaEntradaFaltante[i]))
                {
                    lineaEntera.Add(cadenaEntradaFaltante[i]);

                    i++;
                }

                if (i < cadenaEntradaFaltante.Count)
                {
                    bool lineaContieneTerminalDeOtraSentencia = terminalesQueIndicanComienzoOtraSentencia.Contains(cadenaEntradaFaltante[i]);

                    if (!lineaContieneTerminalDeOtraSentencia)
                    {
                        //salida normal, agarre la linea entera
                        lineaEntera.Add(cadenaEntradaFaltante[i]);
                    }



                    return(Crear(lineaEntera, lineaHastaAhora, contextoGlobal, tipo, fila, col));
                }
                else
                {
                    //no agarre la linea entera. Error x default??
                    return(null);
                }
            }
            else
            {
                return(null);
            }
        }
Beispiel #9
0
        private static void NuevaLinea(Terminal t)
        {
            //ojo con el sino!
            switch (t.Componente.Token)
            {
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Mostrar:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MostrarConPausa:
                contextoLinea = ContextoLinea.Mostrar;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MientrasComienzo:
                contextoLinea = ContextoLinea.Mientras;
                pila.Push(ElementoPila.Mientras);
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MientrasFin:
                contextoLinea = ContextoLinea.FinMientras;
                pila.Pop();
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SiComienzo:
                contextoLinea = ContextoLinea.Si;
                pila.Push(ElementoPila.Si);
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SiSino:
                pila.Push(ElementoPila.Sino);
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SiFin:
                contextoLinea = ContextoLinea.FinSi;
                if (pila.Peek() == ElementoPila.Sino)
                {
                    pila.Pop();
                }
                pila.Pop();

                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ProcedimientoComienzo:
                contextoGlobal = Sintactico.ContextoGlobal.DeclaracionLocal;
                contextoLinea  = ContextoLinea.DeclaracionProc;
                pila.Push(ElementoPila.Procedimiento);
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ProcedimientoFin:
                contextoGlobal = Sintactico.ContextoGlobal.Global;
                contextoLinea  = ContextoLinea.FinProc;
                pila.Pop();
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.FuncionComienzo:
                contextoGlobal = Sintactico.ContextoGlobal.DeclaracionLocal;
                contextoLinea  = ContextoLinea.DeclaracionFuncion;
                pila.Push(ElementoPila.Funcion);
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.FuncionFin:
                contextoGlobal = Sintactico.ContextoGlobal.Global;
                contextoLinea  = ContextoLinea.FinFuncion;
                pila.Pop();
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Comenzar:
                contextoGlobal = ContextoGlobal.Cuerpo;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Constantes:
                contextoGlobal = Sintactico.ContextoGlobal.GlobalDeclaracionesConstantes;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Variables:
                contextoGlobal = Sintactico.ContextoGlobal.GlobalDeclaracionesVariables;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Const:
                contextoLinea = ContextoLinea.DeclaracionConstante;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Var:
                contextoLinea = ContextoLinea.DeclaracionVariable;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Llamar:
                contextoLinea = ContextoLinea.LlamadaProc;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Leer:
                contextoLinea = ContextoLinea.Leer;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Identificador:
                contextoLinea = ContextoLinea.Asignacion;
                break;

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Principal:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Numero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Verdadero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Falso:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.TipoDato:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.TipoNumero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.TipoTexto:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.TipoBooleano:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SiEntonces:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Igual:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Concatenacion:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.SumaEntero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.RestaEntero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MultiplicacionEntero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.DivisionEntero:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Mayor:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MayorIgual:

            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MenorIgual:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Menor:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Distinto:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Negacion:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.And:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Or:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ParentesisApertura:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ParentesisClausura:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.CorcheteApertura:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.CorcheteClausura:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Literal:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Coma:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.De:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Arreglo:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ComentarioApertura:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.ComentarioClausura:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Ninguno:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.Error:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.EOF:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.FinSentencia:
            case CompiladorGargar.Lexicografico.ComponenteLexico.TokenType.MientrasHacer:
            default:
                contextoLinea = ContextoLinea.Ninguno;
                break;
            }

            if (contextoLinea != Sintactico.ContextoLinea.Ninguno)
            {
                AgregarALinea(t);
            }
        }