public PerteneceGreibach(Greibach g, ArrayList<String> s) { // TODO Auto-generated constructor stub if (mensajero == null) mensajero = Mensajero.getInstancia(); lambda = mensajero.devuelveMensaje("simbolos.lambda", 4); gramatica = g; palabra = s; }
public AutomataP_to_GramaticaIC(Automata a) { // TODO Auto-generated constructor stub automataOriginal = (AutomataPila) a; if (a.getEstadosFinales() == null || a.getEstadosFinales().isEmpty()) automataEntrada = ((AutomataPila) a); else automataEntrada = ((AutomataPila) a).convertirPilaVacia(); mensajero = Mensajero.getInstancia(); lambda = mensajero.devuelveMensaje("simbolos.lambda", 4); auxtraduccion = mensajero.devuelveMensaje("simbolos.auxtraduccion", 4); ultimatraduccion = mensajero.devuelveMensaje("simbolos.ultimatraduccion", 4); fondoPila = ((AutomataPila) automataEntrada).getFondoPila(); comienzo = mensajero.devuelveMensaje("simbolos.comienzo", 4).charAt(0); xml = ""; xml += "<pasos>\n"; controlador = Controlador_imp.getInstancia(); lat = ""; lat += mensajero.devuelveMensaje("formatos.cabecera", 5); xmllatex = "<steps>\n<cabecera>" + lat + "</cabecera>\n"; AP_Gramatica(); }
@SuppressWarnings("unchecked") public void cambiaNombreVariables() { ArrayList<String> variables = (ArrayList<String>) gic.getVariables().clone(); HashMap<String, ArrayList<Produccion>> produc = clonarProducciones(gic.getProducciones()); ArrayList<String> nVariables = new ArrayList<String>(); nVariables.add(gic.getVariableInicial()); int tam = gic.getVariables().size(); char ultima = comienzo; char nVar = comienzo; int ii = 1; boolean completo = false; String s = null; int jj = 0; while (ii < tam) { if (!completo) { nVar = new Character(ultima); ultima = (char) (nVar + 1); if (nVar != 'S') { s = nVar + ""; nVariables.add(s); ii++; } if (s.equals(ultimatraduccion)) { completo = true; } } else { s = "[" + auxtraduccion + jj + "]"; nVariables.add(s); jj++; ii++; } } HashMap<String, ArrayList<Produccion>> nProduc = new HashMap<String, ArrayList<Produccion>>(); variables = (ArrayList<String>) variables.clone(); int tamano = nVariables.size(); for (int i = 0; i < tamano; i++) { String var = variables.get(i); String nnVar = nVariables.get(i); ArrayList<Produccion> nListaProd = new ArrayList<Produccion>(); ArrayList<Produccion> listaProd = produc.get(var); int j = 0; int tamListaProd = listaProd.size(); Produccion nProd = null; while (j < tamListaProd) { nProd = new Produccion(); Produccion prod = listaProd.get(j); ArrayList<String> nConcat = nuevaContatenacion(prod, variables, nVariables); if (nConcat != null) nProd.setConcatenacion(nConcat); if (!esta(nProd, nListaProd) && ((nConcat != null))) nListaProd.add(nProd); j++; } nProduc.put(nnVar, nListaProd); } this.gic.setProducciones(nProduc); this.gic.setVariables(nVariables); html += "<br><h2>" + mensajero.devuelveMensaje("simplificacionGICs.genttotalsimp", 2) + "</h2>"; html += "<br><center><table>" + gic.toHTML() + "</table></center><br>"; xmllatex += "</ocultar>"; xmllatex += "\n<step><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.gentradasimlatex", 2) + "</titulo>" + gic.toLat() + "</step>\n"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.genttotalsimp", 2) + "</titulo>" + gic.toXML() + "</paso>\n</pasos>\n"; gic.setXML(xml); gic.setXMLLatex(xmllatex); }
private void limpiaAConciencia(boolean simp) { boolean b = this.getGic().dimeSiHayProdUnitarias(); boolean c = this.getGic().dimeSiHayProdRecursivas(); boolean d; if (simp) d = this.getGic().dimeSiHayVariablesQueNoTienenProd(); else { d = this.getGic().calculaAlcanzables(); if (d) this.getGic().setVariablesSinProd(this.getGic().dameNoAlcanzables()); } boolean e = this.getGic().dimeSiHayProdConProdUnitarias(); boolean a = b || c || d || e; if (simp && a) { html += "<center>" + mensajero.devuelveMensaje("simplificacionGICs.simp", 2) + "</center>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.simp", 2) + "</titulo></paso>\n"; xmllatex += "<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.simplatex", 2) + "</titulo>" + gic.toLat() + "</oculto>\n"; } boolean hecho = false; while (a) { boolean escribe = d; if (escribe && simp) { html += "<br><h2>" + mensajero.devuelveMensaje("simplificacionGICs.quitvsimprod", 2) + "</h2><h3>" + this.getGic().getVariablesSinProd().toString() + "</h3>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.quitvsimprod", 2) + this.getGic().getVariablesSinProd().toString() + "</titulo>"; xmllatex += "<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.quitvsimprodlatex", 2) + this.getGic().getVariablesSinProd().toString() + "</titulo>"; } if (escribe && !simp) { html += "<br><h2>Quitamos variables no alcanzables: </h2><h3>" + this.getGic().dameNoAlcanzables().toString() + "</h3>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.noalc", 2) + this.getGic().dameNoAlcanzables().toString() + "</titulo>"; xmllatex += "<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.noalclatex", 2) + this.getGic().dameNoAlcanzables().toString() + "</titulo>"; } while (d) { this.getGic().quitaVariablesQueNoExisten(); d = this.getGic().dimeSiHayVariablesQueNoTienenProd(); if (!hecho) hecho = true; } if (escribe) { html += "<br><center><table>" + gic.toHTML() + "</table></center><br>"; xml += gic.toXML() + "</paso>\n"; xmllatex += gic.toLat() + "</oculto>\n"; } if (!hecho) { if (b) { html += "<br><h2>" + mensajero.devuelveMensaje("simplificacionGICs.unicaprod", 2) + "</h2><h3>" + this.getGic().getProdUnit().toString() + "</h3>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.unicaprod", 2) + this.getGic().getProdUnit().toString() + "</titulo>"; xmllatex += "<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.unicaprodlatex", 2) + this.getGic().getProdUnit().toString() + "</titulo>"; this.getGic().quitaProdUnitarias(); html += "<br><center><table>" + gic.toHTML() + "</table></center><br>"; xml += gic.toXML() + "</paso>\n"; xmllatex += gic.toLat() + "</oculto>\n"; if (!hecho) hecho = true; } else if (!hecho && c) { html += "<br><h2>" + mensajero.devuelveMensaje("simplificacionGICs.prodrec", 2) + "</h2><h3>" + this.getGic().getProdRecursivas().toString() + "</h3>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.prodrec", 2) + "</titulo>"; xmllatex += "<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.prodreclatex", 2) + "</titulo>"; this.getGic().quitaProdRecursivas(); html += "<br><center><table>" + gic.toHTML() + "</table></center><br>"; xml += gic.toXML() + "</paso>\n"; xmllatex += gic.toLat() + "</oculto>\n"; if (!hecho) hecho = true; } else if (!hecho && e) { if (!this.getGic().getProdConProdUnit().isEmpty()) { html += "<br><h2>" + mensajero.devuelveMensaje("simplificacionGICs.varconpunit", 2) + "</h2><h3>" + this.getGic().getProdConProdUnit() + "</h3>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.varconpunit", 2) + "</titulo>"; xmllatex += "<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.varconpunitlatex", 2) + "</titulo>"; this.getGic().quitaProdConProdUnitarias(); html += "<br><center><table>" + gic.toHTML() + "</table></center><br>"; xml += gic.toXML() + "</paso>\n"; xmllatex += gic.toLat() + "</oculto>\n"; if (!hecho) hecho = true; } } } if (simp) d = this.getGic().dimeSiHayVariablesQueNoTienenProd(); else { d = this.getGic().calculaAlcanzables(); } if (!d) { b = this.getGic().dimeSiHayProdUnitarias(); c = this.getGic().dimeSiHayProdRecursivas(); e = this.getGic().dimeSiHayProdConProdUnitarias(); } a = b || c || d || e; hecho = false; } }
/** * @return Gramatica resultado de aplicar el algoritmo para hallar una gramatica indepenediente de * contexto a partir de un automata de pila dado. */ @SuppressWarnings("unchecked") private void AP_Gramatica() { gic = new GramaticaIC(); gic.setSimbolos((ArrayList<String>) automataEntrada.getAlfabeto().getListaLetras().clone()); gic.setVariableInicial("S"); ArrayList<String> estados = (ArrayList<String>) this.automataEntrada.getEstados().clone(); Iterator<String> it = estados.iterator(); gic.anadeVariable("S"); while (it.hasNext()) { Produccion p = new Produccion(); String ini = this.automataEntrada.getEstadoInicial(); String cadena = "[" + ini + fondoPila + it.next() + "]"; p.anadeCadena(cadena); gic.anadeProduccion("S", p); gic.anadeVariable(cadena); } ArrayList<AristaAP> arista = this.automataEntrada.getAutomataPila(); Iterator<AristaAP> itArista = arista.iterator(); while (itArista.hasNext()) { AristaAP aristaActual = itArista.next(); ArrayList<String> salidaPila = (ArrayList<String>) aristaActual.getSalidaPila().clone(); String destino = new String(aristaActual.getDestino()); String origen = new String(aristaActual.getOrigen()); ArrayList<String> simbolos = (ArrayList<String>) aristaActual.getEntradaSimbolos().clone(); String cima = new String(aristaActual.getCimaPila()); if (desapila(salidaPila)) { anadeProduccionesTerminales(origen, cima, estados, simbolos, destino); } else { int tamLista = salidaPila.size(); ArrayList<ArrayList<String>> listaParesEstados = construyeListasEstados((ArrayList<String>) estados.clone(), tamLista); anadeProduccionesConLista(origen, destino, cima, listaParesEstados, simbolos, salidaPila); } } html = ""; html += "<br><h2>" + mensajero.devuelveMensaje("simplificacionGICs.resulap", 2) + "</h2><center><table>" + gic.toHTML() + "</table></center><br>"; xml += "<paso><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.resulap", 2) + "</titulo>" + gic.toXML() + "</paso>\n"; xmllatex += "<ocultar>\n<oculto><titulo>" + mensajero.devuelveMensaje("simplificacionGICs.resulaplatex", 2) + "</titulo>" + gic.toLat() + "</oculto>\n"; traduceVariables(); }