/// <summary> /// Determina el tipo de una producción. /// </summary> /// <param name="prod">Produccion a checar</param> private TIPO_GRAMATICA _check_type(Produccion prod) { TIPO_GRAMATICA t = TIPO_GRAMATICA.INVALID; // Si es tipo 3... if (_is_type_3(prod)) { return(TIPO_GRAMATICA.REGULAR); } else // Si no, si es tipo 2... if (_is_type_2(prod)) { return(TIPO_GRAMATICA.LIBRE_DE_CONTEXTO); } else // Si no, si es tipo 1... if (_is_type_1(prod)) { return(TIPO_GRAMATICA.DEPENDIENTE_DE_CONTEXTO); } else // Si no, si es tipo 0... if (_is_type_0(prod)) { return(TIPO_GRAMATICA.SIN_RESTRICCIONES); } return(t); }
/// <summary> /// /// </summary> /// <param name="lineas"></param> /// <returns></returns> public GRAM_ERROR AnalizaLineas(String[] lineas) { Produccion p; TIPO_GRAMATICA t_actual; // Limpia la lista de producciones. _producciones.Clear(); _prod_inicial = ""; for (int i = 0; i < lineas.Length; i++) { p = new Produccion(lineas[i]); // Si no hay errores en la producción if (p.Error == Produccion.PROD_ERROR.NO_ERROR) { // Agrega la linea de texto a las lineas. //_input_lines.Add(lineas[i]); // Si la produccion es válida... if (p.IsValid) { _producciones.Add(p); // Agrega la producción a la lista. t_actual = _check_type(p); // Obtiene el tipo de gramática de la producción. // Si la gramática es sin restricciones. if (t_actual == TIPO_GRAMATICA.SIN_RESTRICCIONES) { _type = t_actual; // Se establece el tipo de la gramática. //break; // Termina el análisis } else // Si no, si la gramatica de la producción actual de menor jerarquia que la anterior, guarda la nueva jerarquia. if (t_actual < _type) { _type = t_actual; } } } else { return(GRAM_ERROR.ERROR); } } if (_producciones.Count != 0) { _generate_formal_gram(); } else { return(GRAM_ERROR.EMPTY_GRAM); } return(GRAM_ERROR.NO_ERROR); }
public Gramatica() { _terminales = new List <char>(); _no_terminales = new List <char>(); _input_lines = new List <string>(); _prod_inicial = ""; _producciones = new List <Produccion>(); _primero = new List <Produccion>(); _siguiente = new List <Produccion>(); _type = TIPO_GRAMATICA.REGULAR; }