コード例 #1
0
        private static List <Variable> ObtenerListaId(ParseTreeNode root, string H_AMBITO)
        {
            //LISTA_IDS.Rule = LISTA_IDS + id
            //                | id;
            SingletonListas s = SingletonListas.GetInstance();

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

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

                return(vars);
            }
        }
コード例 #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
            {
            }
        }