Esempio n. 1
0
        private string getTypeToken(string matchRgx)         //El numero de retorno representa la jerarquia de la ER
        {
            Regex rgx1  = new Regex(@"(//((\w)|(\s)|(\p{P})|(\p{S}))+)");
            Regex rgx21 = new Regex(@"^([0-9]+[.][0-9]*(E|e)([+]|[-])?[0-9]+)$");
            Regex rgx22 = new Regex(@"^(0(x|X)([0-9]|[a-fA-F])+)$");
            Regex rgx23 = new Regex(@"^([0-9]+[.][0-9]*)$");
            Regex rgx24 = new Regex(@"^([0-9]+)$");
            Regex rgx3  = new Regex(@"(""((\w)|(\s)|(\p{P})|(\p{S}))+)");
            Regex rgx4  = new Regex(@"(""((\w)|(\s)|(\p{P})|(\p{S}))+"")");
            Regex rgx5  = new Regex(@"([a-zA-Z]([\w]|[_])*)");
            Regex rgx6  = new Regex(@"(<=|>=|==|!=|&&|[||])");

            if (rgx1.IsMatch(matchRgx))
            {
                return("");
            }
            else if (rgx21.IsMatch(matchRgx))
            {
                return("2.1");
            }
            else if (rgx22.IsMatch(matchRgx))
            {
                return("2.2");
            }
            else if (rgx23.IsMatch(matchRgx))
            {
                return("2.3");
            }
            else if (rgx24.IsMatch(matchRgx))
            {
                return("2.4");
            }
            else if (matchRgx == "\"\"")
            {
                return("4");
            }
            else if (rgx4.IsMatch(matchRgx))
            {
                return("4");
            }
            else if (rgx3.IsMatch(matchRgx))
            {
                return("3");
            }
            else if (rgx5.IsMatch(matchRgx))
            {
                return("5");
            }
            else if (rgx6.IsMatch(matchRgx) || Operadores.Contains(matchRgx))
            {
                return("6");
            }
            else
            {
                return("8");
            }
        }
        /// <summary>
        /// Método para la creación del árbol basado en la notación postfija
        /// </summary>
        /// <param name="expresionPostfija"></param>
        public void CrearArbol(string expresionPostfija)
        {
            var pila          = new Stack <Nodo>(); //Pila que guardará momentanemente los nodos para ir formando en orden el árbol
            var contadorHojas = 1;

            while (expresionPostfija.Length != 0)
            {
                var nuevoNodo = new Nodo();

                if (!Operadores.Contains(expresionPostfija[0]) && expresionPostfija[0] != '#') //Si No es un operador y si NO es el estado de ACEPTACIÓN
                {
                    nuevoNodo.ItemExpresion = expresionPostfija[0].ToString();
                    nuevoNodo.NumNodo       = contadorHojas;
                    nuevoNodo.Follow        = new List <Nodo>();
                    nuevoNodo.EsHoja        = true;
                    contadorHojas++;

                    nuevoNodo.AsignarNulabilidad();

                    pila.Push(nuevoNodo);
                }
                else if (Operadores.Contains(expresionPostfija[0]) && expresionPostfija[0] != '#') //Si ES operador
                {
                    if (pila.Count >= 2 && expresionPostfija[0] != '*' && expresionPostfija[0] != '+')
                    {
                        nuevoNodo.ItemExpresion = expresionPostfija[0].ToString();

                        nuevoNodo.DrchNodo = pila.Pop();
                        nuevoNodo.IzqNodo  = pila.Pop();

                        nuevoNodo.AsignarNulabilidad();
                    }
                    else
                    {
                        nuevoNodo.ItemExpresion = expresionPostfija[0].ToString();

                        if (pila.Count > 0)
                        {
                            nuevoNodo.IzqNodo = pila.Pop();
                        }

                        nuevoNodo.AsignarNulabilidad();
                    }
                    pila.Push(nuevoNodo);
                }
                else if (expresionPostfija[0] == '#')
                {
                    nuevoNodo.ItemExpresion = expresionPostfija[0].ToString();
                    nuevoNodo.NumNodo       = contadorHojas;
                    nuevoNodo.EsHoja        = true;

                    nuevoNodo.AsignarNulabilidad();

                    Raiz          = pila.Pop();
                    Raiz.DrchNodo = nuevoNodo;
                    Raiz.AsignarNulabilidad();
                }

                expresionPostfija = expresionPostfija.Remove(0, 1);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Método de conversión de infijo (expresión normal)  a postfijo
        /// </summary>
        /// <param name="infijo">Cadena de expresión normal</param>
        public void ConvertirPostfijo(string infijo)
        {
            Infija = infijo;

            while (Infija != "")
            {
                if (!Operadores.Contains(Infija[0]) && Infija[0] != ')') //Si es operando y diferente a paréntisis derecho
                {
                    Postfija += Infija[0];
                }
                else if (Operadores.Contains(Infija[0]) && Infija[0] != ')') //Si es operador y no es un paréntesis derecho
                {
                    var continuar = false;

                    while (continuar == false)
                    {
                        if (PilaOperdores.Count == 0) //Si la pila está vacía
                        {
                            PilaOperdores.Push(Infija[0]);
                            continuar = true;
                        }
                        else //Si no está vacía
                        {
                            if (EvaluarPrioridad(1, Infija[0]) > EvaluarPrioridad(0, PilaOperdores.Peek()))
                            {
                                PilaOperdores.Push(Infija[0]);
                                continuar = true;
                            }
                            else
                            {
                                Postfija += PilaOperdores.Pop();
                            }
                        }
                    }
                }
                else if (Infija[0] == ')')
                {
                    Postfija += PilaOperdores.Pop();

                    if (PilaOperdores.Peek() == '(')
                    {
                        PilaOperdores.Pop();
                    }
                    else
                    {
                        while (PilaOperdores.Peek() != '(')
                        {
                            Postfija += PilaOperdores.Pop();
                        }

                        PilaOperdores.Pop();
                    }
                }

                Infija = Infija.Remove(0, 1);
            }

            if (PilaOperdores.Count > 0)
            {
                while (PilaOperdores.Count > 0)
                {
                    if (PilaOperdores.Peek() != '(')
                    {
                        Postfija += PilaOperdores.Pop();
                    }
                }
            }

            Postfija += ".#"; //Se le agrega para mostrar que se llegó al estado de aceptación
        }