Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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 + " )";
        }