private int checa_regla_siguiente(String item, String no_terminal) { int index = item.IndexOf(no_terminal); if (index < item.Length - 1 && (item[index + 1] == '\'' || Produccion.IsNoTerminal(item[index + 1]))) { index++; } while (index < item.Length && item[index] == '\'') { index++; } // si tiene parte derecha if (index < item.Length - 1) { return(1); } else { return(2); } return(0); }
/// <summary> /// Determina si la gramatica es de tipo 3 (Regular). /// </summary> /// <param name="prod">Produccion a checar</param> /// <returns>True si la producción es gramática regular, de lo contrario false</returns> private Boolean _is_type_3(Produccion prod) { if (prod.LeftItems.Count == 1 && Produccion.IsNoTerminal(prod.LeftItems[0][0])) { if (Produccion.IsTerminal(prod.RightItems[0][0])) { if (prod.RightItems.Count == 2) { if (Produccion.IsNoTerminal(prod.RightItems[1][0])) { return(true); } else { return(false); } } if (prod.RightItems.Count >= 2) { return(false); } else { return(true); } } } return(false); }
private List <string> genera_tokens(string input) { List <string> nueva = new List <string>(); string tok = ""; for (int i = 0; i < input.Length; i++) { if (Produccion.IsNoTerminal(input[i])) { tok += input[i]; if (i < input.Length - 1 && input[i + 1] == '\'') { tok += "'"; i++; } nueva.Insert(0, tok); tok = ""; } else if (Produccion.IsTerminal(input[i])) { nueva.Insert(0, "" + input[i]); } } return(nueva); }
/// <summary> /// Determina si la gramatica es de tipo 2 (Libre de Contexto). /// </summary> /// <param name="prod">Produccion a checar</param> /// <returns>True si la producción es gramática libre de contexto, de lo contrario false</returns> private Boolean _is_type_2(Produccion prod) { if (prod.LeftItems.Count == 1 && Produccion.IsNoTerminal(prod.LeftItems[0][0])) { return(true); } return(false); }
private string dame_primero_de_item(string item) { string primero = "" + item[0]; if (Produccion.IsNoTerminal(item[0])) { if (item.Length > 1) { for (int i = 1; i < item.Length; i++) { if (item[i] == '\'') { primero += "'"; } else { break; } } } } return(primero); }
private void _generate_formal_gram() { String n_t, s_t; for (int i = 0; i < _producciones[0].LeftItems.Count; i++) { _prod_inicial += _producciones[0].LeftItems[i]; } // Recorre todas las producciones en busca de terminales y no terminales for (int i = 0; i < _producciones.Count; i++) { // Busca terminales y no terminales del lado izquierdo for (int j = 0; j < _producciones[i].LeftItems.Count; j++) { // Si el item izquierdo es no terminal... if (Produccion.IsNoTerminal(_producciones[i].LeftItems[j][0])) { // Si no existe el item en la lista de no termilaes lo agerga if (!_no_terminales.Contains(_producciones[i].LeftItems[j][0])) { _no_terminales.Add(_producciones[i].LeftItems[j][0]); } } else// Si no, si el item es terminal { // Si no existe el item en la lista de terminales lo agerga. if (!_terminales.Contains(_producciones[i].LeftItems[j][0])) { _terminales.Add(_producciones[i].LeftItems[j][0]); } } } // Busca terminales y no terminales del lado derecho for (int j = 0; j < _producciones[i].RightItems.Count; j++) { // Si el item derecho es no terminal... for (int k = 0; k < _producciones[i].RightItems[j].Length; k++) { if (Produccion.IsNoTerminal(_producciones[i].RightItems[j][k])) { // Si no existe el item en la lista de no termilaes lo agerga if (!_no_terminales.Contains(_producciones[i].RightItems[j][k])) { _no_terminales.Add(_producciones[i].RightItems[j][k]); } } else// Si no, si el item es terminal { if (_producciones[i].RightItems[j][k] == '\'' && k > 0 && Produccion.IsNoTerminal(_producciones[i].RightItems[j][k - 1])) { break; } // Si no existe el item en la lista de terminales lo agerga. if (!_terminales.Contains(_producciones[i].RightItems[j][k])) { _terminales.Add(_producciones[i].RightItems[j][k]); } } } } } // Formatea los terminales y no terminales para generar la gramática formal n_t = ""; for (int i = 0; i < _no_terminales.Count; i++) { n_t += _no_terminales[i]; if (i < _no_terminales.Count - 1) { n_t += ", "; } } s_t = ""; for (int i = 0; i < _terminales.Count; i++) { s_t += _terminales[i]; if (i < _terminales.Count - 1) { s_t += ", "; } } _gram_formal = "G = ( { " + n_t + " }, { " + s_t + " }, " + _prod_inicial + " )"; }