public Simbolo(string visibilidad, string nombre, string tipo, string tipoElemento, string ambito, string rol, int apuntado, int tamanho, int noDimen, listaDimensiones dimensiones) { this.visibilidad = visibilidad; this.nombreReal = nombre; this.tipo = tipo; this.ambito = ambito; this.rol = rol; this.apuntador = apuntado; this.tamanho = tamanho; this.tipoElemento = tipoElemento; this.noDimensiones = noDimen; this.dimenesiones = dimensiones; }
private List <Simbolo> generarSimbolosMetodo(ParseTreeNode nodo, List <Simbolo> lista, Ambitos ambitos) { String nombreNodo = nodo.Term.Name.ToString(); switch (nombreNodo) { /*INSTRUCCION.Rule = DECLRACION + Eos | ASIGNACION + Eos no se HACWE // | SI | SALIR + Eos// | CONTINUAR + Eos// | MIENTRAS// | PARA// | LOOP// | HACER// * | REPETIR// | ELEGIR;//*/ #region nuevasJava case Constantes.decla2: { int noHijos = nodo.ChildNodes.Count; if (noHijos == 2) { //TIPO + identificador + ToTerm(";") Simbolo s = new Simbolo(Constantes.noTieneVisi, nodo.ChildNodes[1].Token.ValueString, nodo.ChildNodes[0].ChildNodes[0].Token.ValueString, getTipoAtributo(nodo.ChildNodes[0].ChildNodes[0].Token.ValueString), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1); apuntador++; lista.Add(s); return(lista); } else if (noHijos == 3) { if (nodo.ChildNodes[2].Term.Name.Equals(Constantes.lposiciones, StringComparison.OrdinalIgnoreCase)) { //TIPO + identificador + LPOSICIONES + ToTerm(";") string tipo = nodo.ChildNodes[0].ChildNodes[0].Token.ValueString; string id = nodo.ChildNodes[1].Token.ValueString; ParseTreeNode nodoPosiciones = nodo.ChildNodes[2]; listaDimensiones lDim; Simbolo nuevo; bool bandera = true; //varifico que todo sea int foreach (ParseTreeNode n in nodoPosiciones.ChildNodes) { bandera = bandera && (n.ChildNodes[0].Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase)); } if (bandera) { List <int> valores = new List <int>(); foreach (ParseTreeNode n in nodoPosiciones.ChildNodes) { int g = int.Parse(n.ChildNodes[0].ChildNodes[0].Token.ValueString); // (n.Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase)); valores.Add(g); } lDim = new listaDimensiones(valores); int linealizado = lDim.getLinealizado(); nuevo = new Simbolo(Constantes.noTieneVisi, id, tipo, Constantes.ARREGLO, ambitos.ambitos.Peek(), "arreglo local", apuntador, linealizado, valores.Count, lDim); apuntador++; lista.Add(nuevo); } else { ErrorA er = new ErrorA(Constantes.errorSemantico, "Para los arreglos unicamente se permites valores enteros", nodo.FindToken()); Form1.errores.addError(er); } return(lista); } else { //TIPO + identificador + ToTerm("=") + EXPRESION + ";" Simbolo s = new Simbolo(Constantes.noTieneVisi, nodo.ChildNodes[1].Token.ValueString, nodo.ChildNodes[0].ChildNodes[0].Token.ValueString, getTipoAtributo(nodo.ChildNodes[0].ChildNodes[0].Token.ValueString), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1); apuntador++; lista.Add(s); return(lista); } } else { //TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";"; string tipo = nodo.ChildNodes[0].ChildNodes[0].Token.ValueString; string id = nodo.ChildNodes[1].Token.ValueString; ParseTreeNode nodoPosiciones = nodo.ChildNodes[2]; listaDimensiones lDim; Simbolo nuevo; bool bandera = true; //varifico que todo sea int foreach (ParseTreeNode n in nodoPosiciones.ChildNodes) { bandera = bandera && (n.ChildNodes[0].Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase)); } if (bandera) { List <int> valores = new List <int>(); foreach (ParseTreeNode n in nodoPosiciones.ChildNodes) { int g = int.Parse(n.ChildNodes[0].ChildNodes[0].Token.ValueString); // (n.Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase)); valores.Add(g); } lDim = new listaDimensiones(valores); int linealizado = lDim.getLinealizado(); nuevo = new Simbolo(Constantes.noTieneVisi, id, tipo, Constantes.ARREGLO, ambitos.ambitos.Peek(), "arreglo local", apuntador, linealizado, valores.Count, lDim); apuntador++; lista.Add(nuevo); } else { ErrorA er = new ErrorA(Constantes.errorSemantico, "Para los arreglos unicamente se permites valores enteros", nodo.FindToken()); Form1.errores.addError(er); } return(lista); } } #endregion case Constantes.si: { /* * SI.Rule = ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + L_EXTRAS + SI_NO | ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + L_EXTRAS | ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + SI_NO; */ int noHijos = nodo.ChildNodes.Count; if (noHijos == 3) { ambitos.addIf(); lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); ambitos.ambitos.Pop(); lista = generarSimbolosMetodo(nodo.ChildNodes[2], lista, ambitos); } else { ambitos.addIf(); lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); ambitos.ambitos.Pop(); lista = generarSimbolosMetodo(nodo.ChildNodes[2], lista, ambitos); lista = generarSimbolosMetodo(nodo.ChildNodes[3], lista, ambitos); } return(lista); } case Constantes.lextra: { //L_EXTRAS.Rule = MakeStarRule(L_EXTRAS, EXTRA); foreach (ParseTreeNode nodoHijo in nodo.ChildNodes) { lista = generarSimbolosMetodo(nodoHijo, lista, ambitos); } return(lista); } case Constantes.extraSi: { //EXTRA.Rule = ToTerm(Constantes.sino_si_python) + EXPRESION + ":" + Eos + CUERPO; ambitos.addIf(); lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.sino: { // SI_NO.Rule = ToTerm(Constantes.sino_python) + ":" + Eos + CUERPO; ambitos.addElse(); lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.elegir: { // ELEGIR.Rule = ToTerm(Constantes.elegir) + EXPRESION + ":" + Eos + CUERPOELEGIR; ambitos.addElegir(); lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.x: { ambitos.addX(); lista = generarSimbolosMetodo(nodo.ChildNodes[2], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.cuerpoElegir: { int noHijos = nodo.ChildNodes.Count; if (noHijos == 2) { lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); } else { lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); } return(lista); } case Constantes.lcasos: { foreach (ParseTreeNode nodoHijo in nodo.ChildNodes) { lista = generarSimbolosMetodo(nodoHijo, lista, ambitos); } return(lista); } case Constantes.defecto: { //DEFECTO.Rule = ToTerm(Constantes.defecto) + ":" + Eos + CUERPO; ambitos.addDefecto(); lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.caso: { //CASO.Rule = EXPRESION + TtoTerm(":") + Eos + CUERPO; ambitos.addCaso(); lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.loop: { //LOOP.Rule = ToTerm(Constantes.loop) + ":" + Eos + CUERPO; ambitos.addLoop(); lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.para: { //PARA.Rule = ToTerm(Constantes.para) + "[" + ASIGNACION + ":" + EXPRESION + ":" + EXPRESION + "]" + ":" + Eos + CUERPO; ambitos.addPara(); lista = generarSimbolosMetodo(nodo.ChildNodes[3], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.hacer: { //HACER.Rule = ToTerm(Constantes.hacer) + ":" + Eos + CUERPO + Constantes.mientras + EXPRESION + Eos; ambitos.addHAcer(); lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.repetir: { //REPETIR.Rule = ToTerm(Constantes.repetir) + ":" + Eos + CUERPO + Constantes.hasta + EXPRESION+Eos; ambitos.addRepetir(); lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } case Constantes.asignacion: { break; } case Constantes.cuerpo: { if (nodo.ChildNodes.Count > 0) { return(generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos)); } else { return(lista); } } case Constantes.instrucciones: { foreach (ParseTreeNode nodoHijo in nodo.ChildNodes) { lista = generarSimbolosMetodo(nodoHijo, lista, ambitos); } return(lista); } case Constantes.instruccion: { return(generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos)); } case Constantes.continuar: { break; } case Constantes.salir: { break; } case Constantes.declaracion: { /*DECLAARREGLO.Rule = identificador + POSICIONES; * * DECLRACION.Rule = TIPO + L_IDS | TIPO + DECLAARREGLO; | POSICION.Rule = ToTerm("[") + EXPRESION + "]"; | | POSICIONES.Rule = MakePlusRule(POSICIONES, POSICION); | */ string tipo = nodo.ChildNodes[0].ChildNodes[0].Token.ValueString; if (nodo.ChildNodes[1].Term.Name.Equals(Constantes.lposiciones, StringComparison.OrdinalIgnoreCase)) { //es un arreglo //1. validar que todas las posiciones sean un int Simbolo nuevo; listaDimensiones lDim; string nombreArreglo = nodo.ChildNodes[1].ChildNodes[0].Token.Value.ToString(); ParseTreeNode nodoPos = nodo.ChildNodes[1].ChildNodes[1]; bool bandera = true; foreach (ParseTreeNode n in nodoPos.ChildNodes) { bandera = bandera && (n.ChildNodes[0].Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase)); } if (bandera) { List <int> valores = new List <int>(); foreach (ParseTreeNode n in nodoPos.ChildNodes) { int g = int.Parse(n.ChildNodes[0].ChildNodes[0].Token.ValueString); // (n.Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase)); apuntador++; valores.Add(g); } lDim = new listaDimensiones(valores); int linealizado = lDim.getLinealizado(); nuevo = new Simbolo(Constantes.noTieneVisi, nombreArreglo, tipo, Constantes.ARREGLO, ambitos.ambitos.Peek(), "arreglo local", apuntador, linealizado, valores.Count, lDim); lista.Add(nuevo); } else { ErrorA n = new ErrorA(Constantes.errorSemantico, "Unicamente se aceptan enteros para dimensinoes de arreglos", nodo.FindToken()); Form1.errores.addError(n); } } else { //idnomarmal string nombre; Simbolo nuevo; foreach (ParseTreeNode item in nodo.ChildNodes[1].ChildNodes) { nombre = item.Token.ValueString; if (getTipoAtributo(tipo).Equals(Constantes.OBJETO, StringComparison.OrdinalIgnoreCase)) { nuevo = new Simbolo(Constantes.noTieneVisi, nombre, tipo, getTipoAtributo(tipo), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1); this.apuntador++; } else { nuevo = new Simbolo(Constantes.noTieneVisi, nombre, tipo, getTipoAtributo(tipo), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1); this.apuntador++; } lista.Add(nuevo); } } return(lista); } case Constantes.mientras: { ambitos.addWhile(); //MIENTRAS.Rule = ToTerm(Constantes.mientras) + EXPRESION+":" + Eos + CUERPO; lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos); ambitos.ambitos.Pop(); return(lista); } } return(lista); }