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