public String ejecutar() { String codigo = ""; for (int i = 0; i < tablaSimbolo.Count(); i++) { if (tablaSimbolo[i].rol.Equals("CLASE")) { clase clase = (clase)tablaSimbolo[i].valor; codigo += clase.generar3D(); } else if (tablaSimbolo[i].rol.Equals("DECLARACION")) { declaracion declaracion = (declaracion)tablaSimbolo[i].valor; codigo += declaracion.generar3D(); } else if (tablaSimbolo[i].rol.Equals("METODO")) { metodo metodo = (metodo)tablaSimbolo[i].valor; codigo += metodo.generar3D(); } else if (tablaSimbolo[i].rol.Equals("CONSTRUCTOR")) { metodo metodo = (metodo)tablaSimbolo[i].valor; codigo += metodo.generar3D(); } else if (tablaSimbolo[i].rol.Equals("MIENTRAS")) { mientras metodo = (mientras)tablaSimbolo[i].valor; codigo += metodo.generar3D(); } else if (tablaSimbolo[i].rol.Equals("ASIGNACION")) { asignacion asignacion = (asignacion)tablaSimbolo[i].valor; codigo += asignacion.generar3D(); } else if (tablaSimbolo[i].rol.Equals("HACER_MIENTRAS")) { hacer_mientras hacer_mientras = (hacer_mientras)tablaSimbolo[i].valor; codigo += hacer_mientras.generar3D(); } else if (tablaSimbolo[i].rol.Equals("REPETIR_HASTA")) { repetir_hasta repetir_hasta = (repetir_hasta)tablaSimbolo[i].valor; codigo += repetir_hasta.generar3D(); } else if (tablaSimbolo[i].rol.Equals("LOOP")) { loop loop = (loop)tablaSimbolo[i].valor; codigo += loop.generar3D(); } else if (tablaSimbolo[i].rol.Equals("IMPRIMIR")) { imprimir imprimir = (imprimir)tablaSimbolo[i].valor; codigo += imprimir.generar3D(); } else if (tablaSimbolo[i].rol.Equals("IMPRIMIR")) { imprimir imprimir = (imprimir)tablaSimbolo[i].valor; codigo += imprimir.generar3D(); } else if (tablaSimbolo[i].rol.Equals("PARA")) { para para = (para)tablaSimbolo[i].valor; codigo += para.generar3D(); } else if (tablaSimbolo[i].rol.Equals("ELEGIR")) { elegir elegir = (elegir)tablaSimbolo[i].valor; codigo += elegir.generar3D(); } else if (tablaSimbolo[i].rol.Equals("SI")) { si elegir = (si)tablaSimbolo[i].valor; codigo += elegir.generar3D(); } else if (tablaSimbolo[i].rol.Equals("CONTINUAR")) { codigo += "~CONTINUAR~" + "//Continuar \r\n\n"; } else if (tablaSimbolo[i].rol.Equals("SALIR")) { codigo += "~SALIR~" + "//Salir \r\n\n"; } else if (tablaSimbolo[i].rol.Equals("RETORNAR")) { expresion expresion = (expresion)tablaSimbolo[i].valor; cadena3D expresion3D = expresion.resCondicion(); codigo += "/*Inicio de retorno*/" + "\r\n"; codigo += expresion3D.codigo + "\r\n"; String temp = memoria.getTemp(); codigo += temp + "=P+1" + ";" + "\r\n"; codigo += "Stack[" + temp + "]=" + expresion3D.temporal + ";" + "\r\n"; codigo += "~RETORNAR~" + "//Retornar \r\n"; codigo += "/*Fin de retorno*/" + "\r\n\n"; } } return(codigo); }
public void generar_tabla_simbolo(simbolo simbolo, string nombre_ambito) { switch (simbolo.rol) { case "CLASE": if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, "", simbolo.rol, simbolo.visibilidad, nombre_ambito, simbolo.tamanio, simbolo.posicion); foreach (simbolo simbolo_hijo in simbolo.ambito.tablaSimbolo) { generar_tabla_simbolo(simbolo_hijo, simbolo.nombre); } } break; case "METODO": { if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, simbolo.tipo, simbolo.rol, simbolo.visibilidad, nombre_ambito, simbolo.tamanio, simbolo.posicion); List <simbolo> lista_parametro = ((metodo)simbolo.valor).parametros; foreach (simbolo simb in lista_parametro) { principal.insertarTablaSimbolo(simb.nombre, simb.tipo, simb.rol, simb.visibilidad, nombre_ambito + "_" + simbolo.nombre, simb.tamanio, simb.posicion); } foreach (simbolo simbolo_hijo in simbolo.ambito.tablaSimbolo) { generar_tabla_simbolo(simbolo_hijo, nombre_ambito + "_" + simbolo.nombre); } } } break; case "CONSTRUCTOR": { if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, simbolo.tipo, simbolo.rol, simbolo.visibilidad, nombre_ambito, simbolo.tamanio, simbolo.posicion); List <simbolo> lista_parametro = ((metodo)simbolo.valor).parametros; foreach (simbolo simb in lista_parametro) { principal.insertarTablaSimbolo(simb.nombre, simb.tipo, simb.rol, simb.visibilidad, nombre_ambito + "_" + simbolo.nombre, simb.tamanio, simb.posicion); } foreach (simbolo simbolo_hijo in simbolo.ambito.tablaSimbolo) { generar_tabla_simbolo(simbolo_hijo, nombre_ambito + "_" + simbolo.nombre); } } } break; case "SI": { if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, "", simbolo.rol, "", nombre_ambito, simbolo.tamanio, simbolo.posicion); si si = (si)simbolo.valor; foreach (simbolo simbolo_hijo in si.ambito.tablaSimbolo) { generar_tabla_simbolo(simbolo_hijo, nombre_ambito + "_" + simbolo.nombre); } try { if (si.lista_sino_si != null) { foreach (sino_si sinosi in si.lista_sino_si) { principal.insertarTablaSimbolo("SINO_SI", "", "SINO_SI", "", nombre_ambito, sinosi.ambito.tamanio, -1); foreach (simbolo simb in sinosi.ambito.tablaSimbolo) { generar_tabla_simbolo(simb, nombre_ambito + "_" + "SINO_SI"); } } } } catch { } try { if (si.sino != null) { principal.insertarTablaSimbolo("SINO", "", "SINO", "", nombre_ambito, si.sino.ambito.tamanio, -1); foreach (simbolo simb in si.sino.ambito.tablaSimbolo) { generar_tabla_simbolo(simb, nombre_ambito + "_" + "SINO"); } } } catch { } } } break; case "PARA": { if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, "", simbolo.rol, "", nombre_ambito, simbolo.tamanio, simbolo.posicion); para para = (para)simbolo.valor; if (para.declara_asigna.rol.Equals("DECLARACION")) { generar_tabla_simbolo(para.declara_asigna, nombre_ambito + "_" + simbolo.rol); } foreach (simbolo simbolo_hijo in simbolo.ambito.tablaSimbolo) { generar_tabla_simbolo(simbolo_hijo, nombre_ambito + "_" + simbolo.nombre); } } } break; case "ELEGIR": { if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, "", simbolo.rol, "", nombre_ambito, simbolo.tamanio, simbolo.posicion); elegir elegir = (elegir)simbolo.valor; foreach (caso caso in elegir.lista_caso) { principal.insertarTablaSimbolo("CASO", "", "CASO", "", nombre_ambito + "_" + "ELEGIR", caso.ambito.tamanio, -1); foreach (simbolo simb in caso.ambito.tablaSimbolo) { generar_tabla_simbolo(simb, nombre_ambito + "_ELEGIR_CASO"); } } if (elegir.defecto != null) { principal.insertarTablaSimbolo("DEFECTO", "", "DEFECTO", "", nombre_ambito + "_" + "ELEGIR", elegir.defecto.ambito.tamanio, -1); foreach (simbolo simb in elegir.defecto.ambito.tablaSimbolo) { generar_tabla_simbolo(simb, nombre_ambito + "_ELEGIR_DEFECTO"); } } } } break; case "DECLARACION": { principal.insertarTablaSimbolo(simbolo.nombre, simbolo.tipo, simbolo.rol, simbolo.visibilidad, nombre_ambito, simbolo.tamanio, simbolo.posicion); } break; default: if (simbolo.tamanio > 0) { principal.insertarTablaSimbolo(simbolo.nombre, "", simbolo.rol, "", nombre_ambito, simbolo.tamanio, simbolo.posicion); foreach (simbolo simb in simbolo.ambito.tablaSimbolo) { generar_tabla_simbolo(simb, nombre_ambito + "_" + simbolo.rol); } } break; } }