コード例 #1
0
        private static void AnalizarMetodos(ParseTreeNode root)
        {
            //METODO.Rule = id + TIPODATO + LISTAPARAMETROS + SENTENCIAS
            //            | rmain + TIPODATO + LISTAPARAMETROS + SENTENCIAS;
            string nombre = root.ChildNodes[0].Token.ValueString;
            string tipo   = ObtenerTipoDato(root.ChildNodes[1]);

            SingletonListas s = SingletonListas.GetInstance();
            Ambito          a = new Ambito()
            {
                Id     = nombre,
                Nombre = nombre,
                Tipo   = tipo
            };

            s.Ambitos.Add(a);

            List <Variable> pars = DeclaracionParametros(root.ChildNodes[2], nombre);

            s.AlmacenarParametros(pars, nombre);
            s.AlmacenarVariable(pars, nombre);

            AnalizarSentencias(root.ChildNodes[3], tipo, nombre);
        }
コード例 #2
0
        private static void DeclaracionVariable(ParseTreeNode root, string H_AMBITO)
        {
            //DECLARA.Rule = id + TIPODATO + VALOR
            //             | LISTA_IDS + TIPODATO + VALOR
            //             | id + TIPODATO + E + VALOR;
            SingletonListas s = SingletonListas.GetInstance();

            if (root.ChildNodes.Count == 3)
            {
                List <Variable> vars;
                string          tipoDato      = ObtenerTipoDato(root.ChildNodes[1]);
                string          tipoDatoValor = tipoDato;
                object          valor         = ValorDefecto(tipoDato);

                if (root.ChildNodes[2].ChildNodes.Count > 0)
                {
                    tipoDatoValor = ObtenerTipoDatoValor(root.ChildNodes[2], H_AMBITO);
                }

                if (tipoDatoValor.Equals(""))
                {
                    return;
                }

                if (root.ChildNodes[0].Token == null)
                {
                    vars = ObtenerListaId(root.ChildNodes[0], H_AMBITO);
                    foreach (Variable v in vars)
                    {
                        v.Tipo  = tipoDato;
                        v.Valor = valor;
                    }
                }
                else
                {
                    vars = new List <Variable>();
                    Variable v = new Variable()
                    {
                        Id      = root.ChildNodes[0].Token.ValueString,
                        Tipo    = tipoDato,
                        Fila    = root.ChildNodes[0].Token.Location.Line,
                        Columna = root.ChildNodes[0].Token.Location.Column,
                        Valor   = valor,
                        Indice  = 0,
                        Ambito  = H_AMBITO
                    };
                    if (!s.VerificarId(v, H_AMBITO))
                    {
                        s.NuevoError(H_AMBITO, v.Id, v.Fila, v.Columna, $"Ya se encuentra declarada la variable {v.Id}");
                    }
                    else
                    {
                        vars.Add(v);
                    }
                }

                if (vars.Count != 0)
                {
                    int    fila    = vars[vars.Count - 1].Fila;
                    int    columna = vars[vars.Count - 1].Columna;
                    string id      = vars[vars.Count - 1].Id;

                    if (tipoDato.Equals(tipoDatoValor))
                    {
                        s.AlmacenarVariable(vars, H_AMBITO);
                    }
                    else
                    {
                        s.NuevoError(H_AMBITO, id, fila, columna, "Tipo de datos no coinciden");
                    }
                }
            }
            else
            {
            }
        }