public void crearTransiciones(SubAFN afn, Stack <object[]> simbolos) { EstadoAFD nuevo = new EstadoAFD(0); nuevo.setCerradura(0); estados.Add(nuevo); for (int e = 0; e < estados.Count; e++) { for (int i = 0; i < estados[e].getCerraduras().Count; i++) { Estado est = afn.getEstado(estados[e].getCerradura(i)); //entra al estado que indica la cerradura if (estados[e].getCerradura(i) == afn.getFinal().getId()) { estados[e].setAcepta(); } foreach (TransicionThompson t in est.getTransiciones()) { if (t.getLexema().Equals("ε") && !estados[e].encontrarC(t.getFinal().getId())) { estados[e].setCerradura(t.getFinal().getId()); if (t.getFinal().getId().Equals(afn.getFinal().getId())) { estados[e].setAcepta(); } } else if (!t.getLexema().Equals("ε")) { int m = encontrarMovimiento(t.getLexema(), estados[e]); if (m == estados[e].getMovimiento().Count) //si el mover con dicho simbolo no existe { Movimiento mov = new Movimiento(t.getLexema(), encontrarSimbolo(simbolos, t.getLexema())); mov.getMov().setCerradura(t.getFinal().getId()); mov.setMove(t.getFinal().getId()); estados[e].setMovimiento(mov); } else // si ya existe, se agrega a que otro estado se puede mover con la misma letra { estados[e].getMov(m).getMov().setCerradura(t.getFinal().getId()); estados[e].getMov(m).setMove(t.getFinal().getId()); estados[e].getMov(m).getMov().getCerraduras().Sort(); } } } } estados[e].getCerraduras().Sort(); int edo = encontrarEstado(estados[e].getCerraduras(), e); if (edo != e) { estados.RemoveAt(e); e--; } else { for (int t = 0; t < estados[e].getMovimiento().Count; t++) { int m = encontrarMovEstado(estados[e].getMov(t).getMoves(), e); if (m != -1) { estados[e].getMov(t).getMov().setId(m); } else { EstadoAFD n = estados[e].getMov(t).getMov(); n.setId(estados.Count); estados.Add(n); } } } } }
public string validarLexema(CadenaAValidar cadena) { ExpresionRegular exp = buscarExp(cadena.getId()); string valida = "Cadena Valida"; int estado = 0; int edoant = 0; string tok = ""; char c; string aux; string cad = cadena.getCadena() + "¿"; for (int i = 0; i < cad.Length; i++) { c = cad.ElementAt(i); int j = 0; if (c == '¿' && i == cad.Length - 1) { if (exp.afd.getEstado(estado).isAceptable()) { cadena.tokens.Add(new Token(0, i, tok, Token.TIPO.CADENA)); } else { cadena.errores.Add(new Token(0, i, tok, Token.TIPO.DESCONOCIDO)); } tok = ""; if (i < cad.Length - 1 && estado != 0) { i--; } estado = 0; } else { bool val = false; while (j < exp.afd.getEstado(estado).getMovimiento().Count) { Movimiento mov = exp.afd.getEstado(estado).getMov(j); if (mov.getTipo() == Token.TIPO.TODO) { if (cad.Length >= mov.getId().Length) { int tam = cad.Length - i + 1; if (tam >= mov.getId().Length) { aux = cad.Substring(i, mov.getId().Length); if (aux.Equals(mov.getId())) { edoant = estado; estado = mov.getMov().getId(); i += mov.getId().Length - 1; tok += aux; val = true; break; } } } } else if (mov.getTipo() == Token.TIPO.CONJ) { if (mov.getId().Length == 1) { if (c.ToString() == mov.getId()) { edoant = estado; estado = mov.getMov().getId(); tok += c; val = true; break; } } else if (mov.getId().Length == 2) { bool encontrado = false; if (mov.getId().Equals("\\n")) { if (c == '\n') { encontrado = true; } else if (mov.getId().Equals("\\t")) { if (c == '\t') { encontrado = true; } else if (mov.getId().Equals("\\\'")) { if (c == '\'') { encontrado = true; } else if (mov.getId().Equals("\\\"")) { if (c == '"') { encontrado = true; } } } } } if (encontrado) { tok += c; val = true; edoant = estado; estado = mov.getMov().getId(); break; } } else if (mov.getId().ElementAt(1) == '~') { if (c >= mov.getId().ElementAt(0) && c <= mov.getId().ElementAt(2)) { edoant = estado; val = true; tok += c; estado = mov.getMov().getId(); break; } } else if (mov.getId().ElementAt(1) == ',') { int z = 0; while (z < mov.getId().Length) { if (c == mov.getId().ElementAt(z)) { edoant = estado; tok += c; val = true; estado = mov.getMov().getId(); break; } z += 2; } if (z < mov.getId().Length) { break; } } } else if (mov.getTipo() == Token.TIPO.CADENA) { if (c.ToString() == mov.getId()) { tok += c; edoant = estado; val = true; estado = mov.getMov().getId(); break; } } else if (mov.getTipo() == Token.TIPO.APOSTROFE) { if (c == '\'') { tok += c; val = true; edoant = estado; estado = mov.getMov().getId(); break; } } else if (mov.getTipo() == Token.TIPO.COMILLA) { if (c == '"') { tok += c; edoant = estado; val = true; estado = mov.getMov().getId(); break; } } else if (mov.getTipo() == Token.TIPO.ENTER) { if (c == '\n') { tok += c; edoant = estado; val = true; estado = mov.getMov().getId(); break; } } else if (mov.getTipo() == Token.TIPO.TAB) { if (c == '\t') { tok += c; val = true; edoant = estado; estado = mov.getMov().getId(); break; } } j++; } if (j >= exp.afd.getEstado(edoant).getMovimiento().Count || !val) { if (exp.afd.getEstado(estado).isAceptable()) { cadena.tokens.Add(new Token(0, i, tok, Token.TIPO.CADENA)); } else { if (tok.Equals("")) { tok = c.ToString(); } cadena.errores.Add(new Token(0, i, tok, Token.TIPO.DESCONOCIDO)); } tok = ""; if (i < cad.Length - 1 && estado != 0) { i--; } estado = 0; } } } if (cadena.errores.Count != 0) { valida = "Cadena No Valida"; } return(valida); }
public void setMovimiento(Movimiento mov) { movimientos.Add(mov); }