コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
 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;
 }