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); } }
/// <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 }