コード例 #1
0
        private static string OperarLogico(string valor1, string valor2, ParseTreeNode node)
        {
            if (valor1.Equals("") || valor2.Equals(""))
            {
                return("");
            }
            int a = EnumTipoDato(valor1);
            int b = EnumTipoDato(valor2);

            if (a != EnumTipoDato("boolean") && b != EnumTipoDato("boolean"))
            {
                SingletonListas s = SingletonListas.GetInstance();
                Error           e = new Error()
                {
                    Tipo       = "Semántico",
                    Columna    = node.Token.Location.Column,
                    Fila       = node.Token.Location.Line,
                    Fuente     = node.Token.ValueString,
                    Comentario = $"El operador {node.Token.ValueString} solo admite bool"
                };
                s.Errores.Add(e);
                return("");
            }

            return("boolean");
        }
コード例 #2
0
        private static void LlamadaMetodo(ParseTreeNode root)
        {
            if (root.Term.Name.Equals("LLAMADAMETODO"))
            {
                //LLAMADAMETODO.Rule = id + PARAMETROSLLAMADOS
                //                    | id;
                string          id = root.ChildNodes[0].Token.ValueString;
                SingletonListas s  = SingletonListas.GetInstance();
                Ambito          a  = s.GetAmbito(id);
                if (a == null)
                {
                    s.NuevoError("Semántico", id, root.ChildNodes[0].Token.Location.Line, root.ChildNodes[0].Token.Location.Column, $"No existe el procedimiento {id}");
                    return;
                }

                if (root.ChildNodes.Count == 2)
                {
                }
                else
                {
                }
            }
            else if (root.Term.Name.Equals("PARAMETROSLLAMADOS"))
            {
                //PARAMETROSLLAMADOS.Rule = PARAMETROSLLAMADOS + C
                //                        | C;
                if (root.ChildNodes.Count == 2)
                {
                }
                else
                {
                    List <Variable> pars = new List <Variable>();
                }
            }
        }
コード例 #3
0
        public static SingletonListas GetInstance()
        {
            if (instancia == null)
            {
                instancia = new SingletonListas();
            }

            return(instancia);
        }
コード例 #4
0
 private static void SentenciaIf(ParseTreeNode root, string tipoDato, string H_AMBITO, bool controlFlujo = false)
 {
     if (root.Term.Name.Equals("SENTENCIAIF"))
     {
         //SENTENCIAIF.Rule = rif + SENTENCIAIFAUX;
         SentenciaIf(root.ChildNodes[1], tipoDato, H_AMBITO, controlFlujo);
     }
     else if (root.Term.Name.Equals("SENTENCIAIFAUX"))
     {
         //SENTENCIAIFAUX.Rule = C + SENTENCIAS + SENTENCIAELSEIF;
         SingletonListas s           = SingletonListas.GetInstance();
         string          comparacion = ObtenerC(root.ChildNodes[0], H_AMBITO);
         if (!comparacion.Equals("boolean"))
         {
             Error e = new Error()
             {
                 Tipo       = "Semántico",
                 Fila       = 0,
                 Columna    = 0,
                 Fuente     = "If",
                 Comentario = "Se esperaba boolean"
             };
             s.NuevoError(e);
         }
         Sentencia(root.ChildNodes[1], tipoDato, H_AMBITO, controlFlujo);
         SentenciaIf(root.ChildNodes[2], tipoDato, H_AMBITO, controlFlujo);
     }
     else if (root.Term.Name.Equals("SENTENCIAELSEIF"))
     {
         //SENTENCIAELSEIF.Rule = relse + SENTPRIMA
         //                      |;
         if (root.ChildNodes.Count == 2)
         {
             SentenciaIf(root.ChildNodes[1], tipoDato, H_AMBITO, controlFlujo);
         }
         return;
     }
     else if (root.Term.Name.Equals("SENTPRIMA"))
     {
         //SENTPRIMA.Rule = rif + SENTENCIAIFAUX
         //                | SENTENCIAS;
         if (root.ChildNodes.Count == 2)
         {
             SentenciaIf(root.ChildNodes[1], tipoDato, H_AMBITO, controlFlujo);
         }
         else
         {
             Sentencia(root.ChildNodes[0], tipoDato, H_AMBITO, controlFlujo);
         }
     }
 }
コード例 #5
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);
            }
        }
コード例 #6
0
 private static string OperarRelacional(string valor1, string valor2, ParseTreeNode node, string H_AMBITO)
 {
     if (valor1.Equals("") || valor2.Equals(""))
     {
         return("");
     }
     if (valor1.Equals(valor2))
     {
         return("boolean");
     }
     else
     {
         SingletonListas s = SingletonListas.GetInstance();
         s.NuevoError(H_AMBITO, node.Token.ValueString, node.Token.Location.Line, node.Token.Location.Column, $"El operador {node.Token.ValueString} no admite comparación {valor1} y {valor2}");
         return("");
     }
 }
コード例 #7
0
        private static string NegarE(ParseTreeNode root, string valor, string H_AMBITO)
        {
            // -E
            if (valor.Equals(""))
            {
                return("");
            }
            int tipo = EnumTipoDato(valor);

            if (tipo == EnumTipoDato("int") || tipo == EnumTipoDato("double") || tipo == EnumTipoDato("boolean"))
            {
                return(valor);
            }
            SingletonListas s = SingletonListas.GetInstance();

            s.NuevoError(H_AMBITO, root.Token.ValueString, root.Token.Location.Line, root.Token.Location.Column, $"No se puede negar {valor}");
            return("");
        }
コード例 #8
0
        private static void SentenciaWhile(ParseTreeNode root, string tipoDato, string H_AMBITO, bool controlFlujo = false)
        {
            //SENTENCIAWHILE.Rule = rwhile + C + SENTENCIAS;
            SingletonListas s           = SingletonListas.GetInstance();
            string          comparacion = ObtenerC(root.ChildNodes[1], H_AMBITO);

            if (!comparacion.Equals("boolean"))
            {
                Error e = new Error()
                {
                    Tipo       = "Semántico",
                    Fila       = root.ChildNodes[0].Token.Location.Line,
                    Columna    = root.ChildNodes[0].Token.Location.Column,
                    Fuente     = "while",
                    Comentario = $"Se esperaba tipo de dato boolean"
                };
                s.NuevoError(e);
            }
            Sentencia(root.ChildNodes[2], tipoDato, H_AMBITO, true);
        }
コード例 #9
0
        public override void ReportParseError(ParsingContext context)
        {
            SingletonListas s = SingletonListas.GetInstance();

            base.ReportParseError(context);
            string error = context.CurrentToken.ValueString;
            string tipo;
            int    fila;
            int    columna;
            string descripcion = "";

            if (error.Contains("Invalid character"))
            {
                tipo    = "Léxico";
                fila    = context.Source.Location.Line;
                columna = context.Source.Location.Column;

                string   delimStr = ":";
                char[]   delim    = delimStr.ToCharArray();
                string[] division = error.Split(delim, 2);
                descripcion = "Caracter Invalido " + division[0];
            }
            else
            {
                tipo        = "Sintáctico";
                fila        = context.Source.Location.Line;
                columna     = context.Source.Location.Column;
                descripcion = "Se esperaba: " + context.GetExpectedTermSet().ToString();
            }
            Error e = new Error()
            {
                Tipo       = tipo,
                Fila       = fila,
                Columna    = columna,
                Comentario = descripcion,
                Fuente     = error
            };

            s.NuevoError(e);
        }
コード例 #10
0
        private static void PalabraReturn(ParseTreeNode root, string tipoDato, string H_AMBITO)
        {
            //SENTENCIARETURN.Rule = C
            //                      |;
            SingletonListas s = SingletonListas.GetInstance();

            if (root.ChildNodes.Count == 1)
            {
                string tipoDatoValor = ObtenerC(root.ChildNodes[0], H_AMBITO);
                if (!tipoDatoValor.Equals(tipoDato))
                {
                    Error e = new Error()
                    {
                        Tipo       = "Semántico",
                        Fila       = 0,
                        Columna    = 0,
                        Fuente     = "return",
                        Comentario = $"{H_AMBITO} retorna {tipoDato} no {tipoDatoValor}"
                    };
                    s.NuevoError(e);
                }
            }
            else
            {
                if (!tipoDato.Equals("void"))
                {
                    Error e = new Error()
                    {
                        Tipo       = "Semántico",
                        Fila       = 0,
                        Columna    = 0,
                        Fuente     = "return",
                        Comentario = $"{H_AMBITO} esperaba retornar {tipoDato}"
                    };
                    s.NuevoError(e);
                }
            }
        }
コード例 #11
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);
        }
コード例 #12
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("");
        }
コード例 #13
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
            {
            }
        }