private List <ErrorCompilacion> AnalizarPila() { List <ErrorCompilacion> retorno = new List <ErrorCompilacion>(); if (Pila.ObtenerTope().GetType() == typeof(NoTerminal)) { Terminal t = CadenaEntrada.ObtenerPrimerTerminal(); NoTerminal nt = (NoTerminal)Pila.ObtenerTope(); bool generaProdVacia = false; //Que es esto?? if (!PerteneceNoTerminalesNoEscapeables(nt)) { generaProdVacia = gramatica.NoTerminalGeneraProduccionVacia(nt); } //Buscar en la tabla arroja excepciones sintacticas si encuentra errores. Produccion prod = tabla.BuscarEnTablaProduccion(nt, t, true, generaProdVacia); if (prod != null) { // flanzani 8/1/2012 // Esto es para ver que no se este operando la pila para llegar a un error sintactico, descartando cosas // Si encuentra un problema, devuelve true, y se crea un error sintactico para descartar el tope de la cadena. bool dejarDeOperarPilaYTirarError = ChequearQueNoSeEsteOperandoLaPilaParaUnErrorSintactico(prod); if (dejarDeOperarPilaYTirarError) { // flanzani 8/1/2012 // Este metodo se fija si el estado de la pila es pq falta un token solo, y se fija basandose en que es // el tope de la pila, para ver que terminal tengo que buscar y decir que falta ese para descartar ese AnalizarLugarDeLaPilaYDescartarHastaTerminalQueCorresponda(nt, t, generaProdVacia); } Pila.TransformarProduccion(prod); } } else { if (!((Terminal)Pila.ObtenerTope()).NoEsLambda()) { Terminal t = Terminal.ElementoVacio(); t.Componente.Fila = AnalizadorLexico.FilaActual(); t.Componente.Columna = AnalizadorLexico.ColumnaActual(); if (HabilitarSemantico) { retorno = ArbolSemantico.CalcularAtributos(t); } Pila.DescartarTope(); } } return(retorno); }
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); }