public void generarTabla(List <NodoExpresion> listaNodos, List <int> numeros, List <Object> simbolos, String nombre, NodoExpresion final, ListaCircularGaleria lg, Galeria nuevoGaleria) { listaNodo = listaNodos; name = nombre; listaSimbolos = simbolos; ultimo = final; List <int> estadosCerradura = new List <int>(); for (int i = 0; i < numeros.Count; i++) { NodoExpresion paraCerradura = buscarNodo(numeros.ElementAt(i)); if (paraCerradura != null) { cerradura(paraCerradura, estadosCerradura); } } mostrarCerradura(estadosCerradura); Estado nuevoEstado = new Estado(); nuevoEstado.EstadoInicial = j; j++; nuevoEstado.Numeros = numeros; bool has = estadosCerradura.Any(x => x == ultimo.Id); if (has == true) { nuevoEstado.Aceptacion = true; } transiciones.Add(nuevoEstado); List <Transicion> trancisionesEstado = new List <Transicion>(); for (int i = 0; i < listaSimbolos.Count; i++) { List <int> estadosMueve = new List <int>(); for (int l = 0; l < estadosCerradura.Count; l++) { NodoExpresion paraMove = buscarNodo(estadosCerradura.ElementAt(l)); if (paraMove != null) { move(paraMove, listaSimbolos.ElementAt(i), estadosMueve); } } if (estadosMueve.Count > 0) { bool sn = existeCerradura(estadosMueve); if (sn) { int id = devolverId(estadosMueve); Transicion nuevaTransicion = new Transicion(); nuevaTransicion.Estado = id; nuevaTransicion.Simbolo = listaSimbolos.ElementAt(i).ToString(); trancisionesEstado.Add(nuevaTransicion); } else { Estado apuntar = new Estado(); apuntar.EstadoInicial = j; j++; apuntar.Numeros = estadosMueve; transiciones.Add(apuntar); Transicion nuevaTransicion = new Transicion(); nuevaTransicion.Estado = apuntar.EstadoInicial; nuevaTransicion.Simbolo = listaSimbolos.ElementAt(i).ToString(); trancisionesEstado.Add(nuevaTransicion); siguientes(estadosMueve, apuntar); } } } nuevoEstado.Transiciones = trancisionesEstado; nuevoGaleria.Estados = transiciones; lg.insertar(nuevoGaleria); }
public void analizadorLexico(String codigo, ListaCircularGaleria lg) { int estado = 0; int columna = 0; int fila = 1; string lexema = ""; Char c; codigo = codigo + " "; for (int i = 0; i < codigo.Length; i++) { c = codigo[i]; columna++; switch (estado) { case 0: if (Char.IsLetter(c)) { lexema += c; estado = 1; } else if (c == '-') { lexema += c; Token(lexema, "Guion", fila, columna, i - lexema.Length); lexema = ""; estado = 2; } else if (c == ';') { lexema += c; Token(lexema, "Punto y Coma", fila, columna, i - lexema.Length); lexema = ""; estado = 0; conjunto = false; expresion = false; idconj = ""; idexp = ""; idlexema = ""; exp = ""; conj = ""; lex = ""; } else if (c == ' ') { columna++; estado = 0; } else if (c == '\n') { fila++; estado = 0; columna = 0; } else if (c == ':') { lexema += c; Token(lexema, "Dos Puntos", fila, columna, i - lexema.Length); lexema = ""; estado = 0; } else if (c == '{') { lexema += c; Token(lexema, "Llave Izquierda", fila, columna, i - lexema.Length); lexema = ""; estado = 0; } else if (c == '}') { lexema += c; Token(lexema, "Llave Derecha", fila, columna, i - lexema.Length); lexema = ""; estado = 0; } else if (c == '\u0022') { lexema += c; Token(lexema, "Comillas", fila, columna, i - lexema.Length); lexema = ""; estado = 4; } else if (c == '/') { lexema += c; estado = 5; } else if (c == '<') { lexema += c; estado = 7; } else { lexema += c; Error("Caracter Desconocido", lexema, fila, columna); lexema = ""; estado = 0; } break; case 1: if (Char.IsLetterOrDigit(c)) { lexema += c; estado = 1; } else { Boolean reser = false; reser = palabraReservada(lexema); if (reser) { Token(lexema, "Palabra Reservada", fila, columna, i - lexema.Length); } else { Token(lexema, "Identificador", fila, columna, i - lexema.Length); } estado = 0; i--; columna--; lexema = ""; } break; case 2: if (c == '>') { lexema += c; Token(lexema, "Mayor que", fila, columna, i - lexema.Length); lexema = ""; estado = 3; } else { estado = 0; } break; case 3: if (c == ';') { if (conjunto == true) { conj = lexema; Conjunto nuevoConjunto = new Conjunto(idconj, conj); listaConjuntos.Add(nuevoConjunto); Token(lexema, "Conjunto " + idconj, fila, columna, i - lexema.Length); } else if (conjunto == false) { exp = lexema; Expresion nuevaExpresion = new Expresion(idexp, exp); listaExpresiones.Add(nuevaExpresion); Token(lexema, "Expresion Regular " + idexp, fila, columna, i - lexema.Length); } lexema = ""; estado = 0; columna--; i--; } else { lexema += c; } break; case 4: if (c == '\u0022') { if (conjunto == false) { lex = lexema; Lexema nuevoLexema = new Lexema(idlexema, lex); listaLexemas.Add(nuevoLexema); Token(lexema, "Lexema - " + idlexema, fila, columna, i - lexema.Length); lexema = ""; } lexema += c; Token(lexema, "Comillas", fila, columna, i - lexema.Length); lexema = ""; estado = 0; } else { lexema += c; } break; case 5: if (c == '/') { lexema += c; estado = 6; } else { lexema += c; Error("Caracter Desconocido", lexema, fila, columna); lexema = ""; estado = 0; } break; case 6: if (c == '\n') { Token(lexema, "Comentario Simple", fila, columna, i - lexema.Length); lexema = ""; estado = 0; } else { lexema += c; } break; case 7: if (c == '!') { lexema += c; Token(lexema, "Abrir Comentario Multilinea", fila, columna, i - lexema.Length); lexema = ""; estado = 8; } else { lexema += c; Error("Caracter Desconocido", lexema, fila, columna); lexema = ""; estado = 0; } break; case 8: if (c == '!') { Token(lexema, "Comentario Multilinea", fila, columna, i - lexema.Length); lexema = ""; lexema += c; estado = 9; } else { lexema += c; } break; case 9: if (c == '>') { lexema += c; Token(lexema, "Cerrar Comentario Multilinea", fila, columna, i - lexema.Length); lexema = ""; estado = 0; } else { lexema += c; Error("Caracter Desconocido", lexema, fila, columna); lexema = ""; estado = 0; } break; } } if (listaErrores.Count == 0) { Generar_Thompson gt = new Generar_Thompson(); gt.separarNodos(listaExpresiones, lg); } else { MessageBox.Show("Existen Errores Lexicos"); } }
public void separarNodos(List <Expresion> listaExpresiones, ListaCircularGaleria lg) { for (int h = 0; h < listaExpresiones.Count; h++) { String expresion = listaExpresiones.ElementAt(h).ExpresionRegular; String nombreGrafica = listaExpresiones.ElementAt(h).Identificador; int estado = 0; string lexema = ""; Char c; grafica += "digraph " + nombreGrafica + " { \n"; grafica += "rankdir = \u0022LR\u0022; \n"; grafica += "node [shape = circle, height=.1]; \n"; expresion = expresion + " "; for (int i = 0; i < expresion.Length; i++) { c = expresion[i]; switch (estado) { case 0: if (c == '|') { nodos.Add(c); } else if (c == '.') { nodos.Add(c); } else if (c == '+') { nodos.Add(c); } else if (c == '*') { nodos.Add(c); } else if (c == '?') { nodos.Add(c); } else if (c == '{') { estado = 1; } else if (c == '\u0022') { lexema += c; estado = 2; } break; case 1: if (c == '}') { nodos.Add(lexema); lexema = ""; estado = 0; } else { lexema += c; } break; case 2: if (c == '\u0022') { lexema += c; nodos.Add(lexema); lexema = ""; estado = 0; } else { lexema += c; } break; } } j = 0; Object nodo = nodos.ElementAt(j); NodoExpresion nuevo = new NodoExpresion(); nuevo.Id = j; listaNodos.Add(nuevo); generarAFN(nodo, 0, nuevo); raiz = nuevo; grafica += "}"; Graficador gr = new Graficador(); gr.graficar(grafica, nombreGrafica); MetodoSubconjuntos ms = new MetodoSubconjuntos(); List <int> numeros = new List <int>(); numeros.Add(0); Galeria nuevoGaleria = new Galeria(); nuevoGaleria.Nombre = nombreGrafica; nuevoGaleria.Simbolos = simbolos; ms.generarTabla(listaNodos, numeros, simbolos, nombreGrafica, ultimo, lg, nuevoGaleria); ms.GraficarAFD(); nodos = new List <object>(); listaNodos = new List <NodoExpresion>(); simbolos = new List <object>(); j = 0; k = 0; grafica = ""; } }