コード例 #1
0
        private static string ObtenerE(ParseTreeNode root, string H_AMBITO)
        {
            if (root.ChildNodes.Count == 3)
            {
                //E.Rule = E + mas + E
                //       | E + menos + E
                //       | E + por + E
                //       | E + dividir + E
                //       | E + modulo + E
                //       | E + potencia + E
                string valor1 = ObtenerE(root.ChildNodes[0], H_AMBITO);
                string valor2 = ObtenerE(root.ChildNodes[2], H_AMBITO);
                if (valor1.Equals("") || valor2.Equals(""))
                {
                    return("");
                }
                int a       = EnumTipoDato(valor1);
                int b       = EnumTipoDato(valor2);
                int columna = root.ChildNodes[1].Token.Location.Column;
                int fila    = root.ChildNodes[1].Token.Location.Line;

                if (root.ChildNodes[1].Token.ValueString.Equals("+"))
                {
                    return(SUMA[a, b]);
                }
                if (root.ChildNodes[1].Token.ValueString.Equals("-"))
                {
                    return(RESTA[a, b]);
                }
                if (root.ChildNodes[1].Token.ValueString.Equals("*"))
                {
                    return(MULTIPLICACION[a, b]);
                }
                if (root.ChildNodes[1].Token.ValueString.Equals("/"))
                {
                    return(DIVISION[a, b]);
                }
                if (root.ChildNodes[1].Token.ValueString.Equals("%"))
                {
                    return(MODULO[a, b]);
                }
                if (root.ChildNodes[1].Token.ValueString.Equals("^"))
                {
                    return(POTENCIA[a, b]);
                }
            }
            else
            {
                //E
                if (root.ChildNodes[0].Token == null)
                {
                    return(ObtenerE(root.ChildNodes[0], H_AMBITO));
                }
                //rtrue
                if (root.ChildNodes[0].Token.ValueString.ToLower().Equals("true"))
                {
                    return("boolean");
                }
                //rfalse
                if (root.ChildNodes[0].Token.ValueString.ToLower().Equals("false"))
                {
                    return("boolean");
                }
                if (root.ChildNodes[0].Term.Name.Equals("id"))
                {
                    //id
                    SingletonListas s = SingletonListas.GetInstance();
                    Variable        v = s.GetVariable(root.ChildNodes[0].Token.ValueString, H_AMBITO);
                    if (v != null)
                    {
                        return(v.Tipo);
                    }
                    else
                    {
                        s.NuevoError("Semántico", root.ChildNodes[0].Token.ValueString, root.ChildNodes[0].Token.Location.Line, root.ChildNodes[0].Token.Location.Column, $"La variable {root.ChildNodes[0].Token.ValueString} no se encuentra declarada");
                    }
                }
                //numentero
                //numdecimal
                //cadena
                //caracter
                return(root.ChildNodes[0].Term.Name.ToLower());
            }

            return("");
        }