//Metodo para verificar si un simbolo existe public bool existes(string cad, CTK centrada) { NT n; NT org = centrada.buscar(cad); if (org == null) { org = centrada.buscar3(cad); } if (org == null) { org = centrada.buscar4(cad); } if (org == null) { org = centrada.buscar5(cad); } if (org == null) { org = centrada.buscar2(cad); } if (org != null) { n = org.copiar(); ltok.Add(n); return(true); } else { return(false); } }
//Este metodo crea la parte izquierda de la produccion, recibe una cadena de la cual se //extraeran los tokens y una lista de tokens. public bool partiz(string texto, CTK listokens) { ladoIzq = listokens.buscar(texto); if (ladoIzq == null) { ladoIzq = new NT(texto); listokens.agregaToken(ladoIzq); } ladoIzq.NoTerminal(); return(true); }
//Este metodo es el encargado de crear las nuevas producciones, recibe una cadena que es de //donde se extraeran los tokens al igual que una lista de tokens, regresa la nueva produccion //si es que se pudo crear. private Produccion nuevaprod(string cadena, CTK listokens) { Produccion prodaux = new Produccion(); if (prodaux.crealistok(cadena, listokens) == true) { return(prodaux); } else { return(null); } }
//Metodo para crear una cadena de tokens. public bool creaCadena(string cadenaEntrada, CTK cajaTokens) { foreach (var aux in cadenaEntrada.Replace("\t", "").Split(' ')) { if (aux != "" && aux != " ") { if ((existes(aux.ToString(), cajaTokens) == false) && (aux != "\0")) { return(false); } } } return(true); }
//Metodo para crear nuevos tokens. public void nuevotok(string stcrear, CTK ctks) { NT nuevo = ctks.buscar(stcrear); if (nuevo != null) { ltok.Add(nuevo); } else { nuevo = new NT(stcrear); ctks.agregaToken(nuevo); ltok.Add(nuevo); } }
//Este metodo crea la parte derecha de la produccion, recibe una cadena de la cual se //extraeran los tokens y una lista de tokens. public bool parder(string entrada, CTK tkns, ref int numero) { string cadena = entrada; if (cadena == "") { return(false); } cadena = cadena.Replace("\\|", "::"); string[] datos = cadena.Split('|'); Produccion produccion; string text; foreach (string cad in datos) { if (cad != "") { Char[] c = new char[1] { ' ' }; text = ""; // text = cad.Replace(" ", ""); foreach (var it in cad.Split(c, StringSplitOptions.RemoveEmptyEntries)) { if (it != " ") { text += "<" + it + ">"; } } produccion = nuevaprod(text, tkns); if ((produccion == null) || (produccion.epsnovalido() == true)) { return(false); } else if (existpro(produccion) == false) { produccion.numero = numero; numero++; derecha.Add(produccion); } } } return(true); }
//Metodo para crear lista de tokens public bool crealistok(string centr, CTK contoks) { int tipo = 0; int tipoant = 0; string cad = ""; string cad2 = centr; cad2 = cad2.Replace("\\>", "|>|"); cad2 = cad2.Replace("\\<", "|<|"); cad2 = cad2.Replace("\\~", "|~|"); cad2 = cad2.Replace("\\e", "|℮|"); cad2 = cad2.Replace("\\0", "\0"); cad2 = cad2.Replace("::", "|||"); cad2 = cad2.Replace("~", "ε"); foreach (char c in cad2) { switch (tipo) { case 0: if (c == '<') { tipo = 1; break; } if (c == '|') { tipoant = 0; tipo = 2; break; } nuevotok(c.ToString(), contoks); if (c == 'ε') { if (cad2.Length == 1) { return(true); } else { return(false); } } break; case 1: if (c == '>') { nuevotok(cad, contoks); tipo = 0; cad = ""; break; } else { if (c == '|') { tipoant = 1; tipo = 2; break; } else { cad = cad + c.ToString(); } } break; case 2: cad = cad + c.ToString(); tipo = 3; break; case 3: tipo = tipoant; if (tipo == 0) { nuevotok(cad, contoks); cad = ""; } break; } } return(tipo == 0); }