예제 #1
0
        public ArbolExpresion GetArbolExpresion(string expresion)
        {
            ArbolExpresion resultado = new ArbolExpresion();
            Stack <NodoArbol <TokenExpresion> > pilaVariables = new Stack <NodoArbol <TokenExpresion> >();
            Stack <TokenExpresion> pilaOperadores             = new Stack <TokenExpresion>();
            Scanner s = new Scanner();
            List <TokenExpresion> tokens = s.GetTokens(expresion);

            foreach (TokenExpresion t in tokens)
            {
                if (t.EsSimboloAgrupacionApertura())
                {
                    pilaOperadores.Push(t);
                }
                else if (t.EsSimboloAgrupacionCierre())
                {
                    bool continuar = true;
                    while (continuar)
                    {
                        TokenExpresion t1 = pilaOperadores.Pop();
                        if (t1.EsSimboloAgrupacionApertura())
                        {
                            continuar = false;
                        }
                        else
                        {
                            NodoArbol <TokenExpresion> n = new NodoArbol <TokenExpresion>();
                            n.Valor = t1;
                            n.Der   = pilaVariables.Pop();
                            n.Izq   = pilaVariables.Pop();
                            pilaVariables.Push(n);
                        }
                    }
                }
                else if (t.EsOperador())
                {
                    bool continuar = true;
                    while (continuar)
                    {
                        if (pilaOperadores.Count == 0)
                        {
                            break;
                        }

                        TokenExpresion t1 = pilaOperadores.Peek();
                        if (t1.EsSimboloAgrupacionApertura())
                        {
                            continuar = false;
                        }
                        else if (t1.GetPrecedencia() > t.GetPrecedencia())
                        {
                            t1 = pilaOperadores.Pop();
                            NodoArbol <TokenExpresion> n1 = new NodoArbol <TokenExpresion>();
                            n1.Valor = t1;
                            n1.Der   = pilaVariables.Pop();
                            n1.Izq   = pilaVariables.Pop();
                            pilaVariables.Push(n1);
                        }
                        else
                        {
                            continuar = false;
                        }
                    }
                    pilaOperadores.Push(t);
                }
                else
                {
                    NodoArbol <TokenExpresion> n = new NodoArbol <TokenExpresion>();
                    n.Valor = t;
                    pilaVariables.Push(n);
                }
            }

            while (pilaOperadores.Count > 0)
            {
                TokenExpresion             operador = pilaOperadores.Pop();
                NodoArbol <TokenExpresion> n        = new NodoArbol <TokenExpresion>();
                n.Valor = operador;
                n.Der   = pilaVariables.Pop();
                n.Izq   = pilaVariables.Pop();
                pilaVariables.Push(n);
            }

            if (pilaVariables.Count > 0)
            {
                resultado.Raiz = pilaVariables.Pop();
            }
            return(resultado);
        }