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