public static void Accion(ParseTreeNode Nodo) { switch (Nodo.Term.Name.ToString()) { //capturamos lo que trae el nodo case "INICIO": Ambito = "Global"; for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } break; case "INSTRUCCIONES": Accion(Nodo.ChildNodes[0]); break; #region Declaracion Variables case "DECLARACION": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } break; case "TIPOVAR": Accion(Nodo.ChildNodes[0]); break; case "MASDECLA": if (Nodo.ChildNodes.Count == 2) //tkCOMA + LISTAVARIABLES { //Console.WriteLine(tipo + " " + Id + ";"); TS.Add(new Variables(Id, tipo, "", Ambito)); Id = ""; Accion(Nodo.ChildNodes[1]); } else if (Nodo.ChildNodes.Count == 3) //tkIGUAL + OPERACIONES + LISTAVARIABLES { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 1) { RESULTADOGENERAL = Operaciones(Nodo.ChildNodes[i]); // Console.WriteLine(tipo + " " + Id + "= " + RESULTADOGENERAL + ";"); try { if (tipo.Equals("int")) { int num = Convert.ToInt32(RESULTADOGENERAL); } } catch (Exception) { ErroresSemanticos.Add("Error de tipos"); } try { if (tipo.Equals("bool")) { bool num = Convert.ToBoolean(RESULTADOGENERAL); } } catch (Exception) { ErroresSemanticos.Add("Error de tipos"); } TS.Add(new Variables(Id, tipo, RESULTADOGENERAL, Ambito)); Id = ""; RESULTADOGENERAL = ""; } else { Accion(Nodo.ChildNodes[i]); } } } else //Empty { //Console.WriteLine(tipo + " " + Id + ";"); TS.Add(new Variables(Id, tipo, "", Ambito)); Id = ""; } break; case "LISTAVARIABLES": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } break; case "VAR": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } break; case "POSIBLEASIGNACION": if (Nodo.ChildNodes.Count > 0) // POSIBLEASIGNACION = "=" + OPERACIONES { RESULTADOGENERAL = Operaciones(Nodo.ChildNodes[1]); // Console.WriteLine(tipo + " " + Id + "= " + RESULTADOGENERAL + ";"); TS.Add(new Variables(Id, tipo, RESULTADOGENERAL, Ambito)); Id = ""; RESULTADOGENERAL = ""; } else //Empty { // Console.WriteLine(tipo + " " + Id + ";"); TS.Add(new Variables(Id, tipo, "", Ambito)); Id = ""; RESULTADOGENERAL = ""; } break; #endregion #region AsignacionVariables case "ASIGNACION": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 2) { RESULTADOGENERAL = Operaciones(Nodo.ChildNodes[i]); } else { Accion(Nodo.ChildNodes[i]); } } //buscamos el id en mi tabla de simbolos for (int i = 0; i < TS.Count; i++) { Variables Var = (Variables)TS[i]; if (Var.getId().Equals(Id) && (Var.getAmbito().Equals("Global") || Var.getAmbito().Equals(Ambito))) { Var.setDato(RESULTADOGENERAL); } } break; #endregion #region comentado case "METODO": Ambito = "Metodo " + Nodo.ChildNodes[1].Token.Value.ToString(); contadormetodos++; ParseTreeNode Retorno = null; ParseTreeNode Cuerpo = Nodo; parame = false; for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 8) { Retorno = Nodo.ChildNodes[i]; } if (i == 6 && !Nodo.ChildNodes[1].Token.Value.ToString().Equals("main")) { } else { if (i == 1) { tipometodomaximo = tipo; } else if (i == 2) { nombremetodomaximo = Id; } Accion(Nodo.ChildNodes[i]); } } List <String> list2 = new List <String>(); //copio los elementos porque antes los estaba poniendo por referencias y los cambios se veian afectados list2 = Parametros_Metodos.ToList(); MT.Add(new Metodos(nombremetodomaximo, tipometodomaximo, list2, Retorno, Cuerpo)); //la lista de parametros tambien deben ser variables declaradas Parametros_Metodos.Clear(); Ambito = "Global"; Id = ""; tipo = ""; parame = false; break; case "PARAMETROS": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } parame = false; break; case "PARAME": parame = true; for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } Parametros_Metodos.Add(tipo_parametro + " " + Id_parametro); TS.Add(new Variables(Id_parametro, tipo_parametro, "", Ambito)); //los paramteros tambien los agregamos a la tabla de simbolos break; case "LISTASENTENCIAS": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } break; case "SENTENCIAS": /*SENTENCIAS.Rule = LLAMADA + tkPUNTOYCOMA | DECLARACION | ASIGNACION | PRINT | IF | WHILE | DO | Empty;*/ for (int i = 0; i < Nodo.ChildNodes.Count; i++) { Accion(Nodo.ChildNodes[i]); } break; case "PRINT": //PRINT.Rule = tkPRINT + tkPARA + LEXPRESION + tkPARC + tkPUNTOYCOMA Print = ""; Accion(Nodo.ChildNodes[2]); Console.WriteLine(Print); Impresiones.Add(Print); break; case "LEXPRESION": if (Nodo.ChildNodes.Count == 3) //LEXPRESION + tkMAS + OPERACIONES <------- tengo que cambiar ese mas porque si no me lo toma como que fuera parte de la operacion { Accion(Nodo.ChildNodes[0]); String texto = Operaciones(Nodo.ChildNodes[2]); Print += texto; } else if (Nodo.ChildNodes.Count == 1) { String texto = Operaciones(Nodo.ChildNodes[0]); Print += texto; } break; case "IF": acceso = ""; bool bandera = false; // IF.Rule = tkIF + tkPARA + CONDICIONES + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC + BLOQUEELSE for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 2) { acceso = Condiciones(Nodo.ChildNodes[i]); if (!acceso.Equals("")) { bandera = Convert.ToBoolean(acceso); } if (bandera) { //Console.WriteLine(acceso); //acceso permitido lee las sentencias de if } else { i = 6; //acceso denegado salta a las sentencias de else7 } } else { if (bandera && i == 7) { break; } else { Accion(Nodo.ChildNodes[i]); } } } break; case "BLOQUEELSE": if (Nodo.ChildNodes.Count > 0) // BLOQUEELSE.Rule = tkELSE + tkLLAVA + LISTASENTENCIAS + tkLLAVC { Accion(Nodo.ChildNodes[2]); } break; case "WHILE": acceso = ""; bool bandera1 = false; //WHILE.Rule = tkWHILE + tkPARA + CONDICIONES + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 2) { acceso = Condiciones(Nodo.ChildNodes[i]); if (!acceso.Equals("")) { bandera1 = Convert.ToBoolean(acceso); } if (!bandera1) { i = 6; //acceso denegado se salta al ultimo token y se acaba el for y no entrara a las sentencias del while. } } else { if (i == 5 && bandera1) { // se va a aquedar enciclado hasta que la condicion se cumpla. while (bandera1 == true) { Accion(Nodo.ChildNodes[i]); i = 0; break; } } else { Accion(Nodo.ChildNodes[i]); } } } break; case "DO": acceso = ""; bool bandera2 = false; // DO.Rule = tkDO + tkLLAVA + LISTASENTENCIAS + tkLLAVC + tkWHILE + tkPARA + CONDICIONES + tkPARC + tkPUNTOYCOMA for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 6) { acceso = Condiciones(Nodo.ChildNodes[i]); if (!acceso.Equals("")) { bandera2 = Convert.ToBoolean(acceso); } if (bandera2 == true) { i = 0; } } else { Accion(Nodo.ChildNodes[i]); } } break; case "LLAMADA": bool existemetodo = false; Accion(Nodo.ChildNodes[0]); //solo capturo el id y ya for (int i = 0; i < MT.Count; i++) { Metodos met = (Metodos)MT[i]; if (met.getId().Equals(Id)) { LLamadaMetodo(Nodo); AccionesMetodo(met.getCuerpo()); existemetodo = true; break; } } if (!existemetodo) { Console.WriteLine("Error Semantico metodo " + Id + " no ha sido declarado."); } Id = ""; break; #endregion #region TERMINALES case "int": case "bool": case "float": if (parame) { tipo_parametro = Nodo.Token.Value.ToString(); } else { tipo = Nodo.Token.Value.ToString(); } break; case "char": if (parame) { tipo_parametro = "char*"; } else { tipo = "char*"; } break; case "Id": if (parame) { Id_parametro = Nodo.Token.Value.ToString(); } else { Id = Nodo.Token.Value.ToString(); } break; #endregion default: // Console.WriteLine(Nodo.Term.Name.ToString()); break; } }
public static void LLamadaMetodo(ParseTreeNode Nodo) { switch (Nodo.Term.Name.ToString()) { #region LLamadaMetodos case "LLAMADA": idmetodo = ""; contadorparametros = 0; for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 0) { idmetodo = Nodo.ChildNodes[0].Token.Value.ToString(); //capturo su id } else { LLamadaMetodo(Nodo.ChildNodes[i]); } } break; case "LVARIABLES": if (Nodo.ChildNodes.Count == 3) { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { LLamadaMetodo(Nodo.ChildNodes[i]); } } else if (Nodo.ChildNodes.Count == 1) { LLamadaMetodo(Nodo.ChildNodes[0]); } break; case "VARIA": String Operacion = Operaciones(Nodo.ChildNodes[0]); for (int i = 0; i < MT.Count; i++) { Metodos met = (Metodos)MT[i]; if (met.getId().Equals(idmetodo)) { List <String> parametros = met.getParametros(); for (int j = 0; j < parametros.Count; j++) { String parametro = parametros[j]; String[] para = parametro.Split(' '); String pa = para[1].Trim(); if (j == contadorparametros) { for (int z = 0; z < TS.Count; z++) { Variables var = (Variables)TS[z]; if (var.getId().Equals(pa)) { var.setDato(Operacion); } } } } } } contadorparametros++; break; } #endregion }
public static String Operaciones(ParseTreeNode Nodo) { String resultado = ""; try { double number1 = 0.0; double number2 = 0.0; switch (Nodo.Term.Name.ToString()) { case "OPERACIONES": if (Nodo.ChildNodes.Count == 3) // OPERACIONES = OPERACIONES + OPEREACIONES1 { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 0) { number1 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } else if (i == 2) { number2 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } } resultado = (number1 + number2).ToString(); return(resultado); } else { resultado = Operaciones(Nodo.ChildNodes[0]); } break; case "OPERACIONES1": if (Nodo.ChildNodes.Count == 3) // OPERACIONES = OPERACIONES + OPEREACIONES1 { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 0) { number1 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } else if (i == 2) { number2 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } } resultado = (number1 - number2).ToString(); return(resultado); } else { resultado = Operaciones(Nodo.ChildNodes[0]); } break; case "OPERACIONES2": if (Nodo.ChildNodes.Count == 3) // OPERACIONES = OPERACIONES + OPEREACIONES1 { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 0) { number1 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } else if (i == 2) { number2 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } } resultado = (number1 * number2).ToString(); return(resultado); } else { resultado = Operaciones(Nodo.ChildNodes[0]); } break; case "OPERACIONES3": if (Nodo.ChildNodes.Count == 3) // OPERACIONES = OPERACIONES + OPEREACIONES1 { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 0) { number1 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } else if (i == 2) { number2 = Convert.ToDouble(Operaciones(Nodo.ChildNodes[i])); } } resultado = number1 / number2 + ""; return(resultado); } else { resultado = Operaciones(Nodo.ChildNodes[0]); } break; case "OPERACIONES4": if (Nodo.ChildNodes.Count == 2) { resultado = "-" + Operaciones(Nodo.ChildNodes[1]); return(resultado); } else if (Nodo.ChildNodes.Count == 1) { resultado = Operaciones(Nodo.ChildNodes[0]); } break; case "OPERACIONES5": if (Nodo.ChildNodes.Count == 3) //vienen parentesis entonces por precedencia se hara primero { resultado = Operaciones(Nodo.ChildNodes[1]); } else { if (Nodo.ChildNodes[0].Term.Name.ToString().Equals("LLAMADA")) { //Operaciones(Nodo.ChildNodes[0]); LLamadaMetodo(Nodo.ChildNodes[0]); for (int i = 0; i < MT.Count; i++) { Metodos met = (Metodos)MT[i]; if (met.getId().Equals(idmetodo)) { //mandaremos acciones // Console.WriteLine("\n\n"); AccionesMetodo(met.getCuerpo()); resultado = Operaciones(met.getRetorno()); } } } else { resultado = Operaciones(Nodo.ChildNodes[0]); } } break; case "BOOLEANOS": resultado = Operaciones(Nodo.ChildNodes[0]); break; case "Entero": case "Decimal": case "Cadena": case "true": case "false": resultado = Nodo.Token.Value.ToString(); break; case "Id": //verificacion que el id exista y tenga valor if (TS.Count > 0) { for (int i = 0; i < TS.Count; i++) { Variables VAR = (Variables)TS[i]; if (Nodo.Token.Value.ToString().Equals(VAR.getId())) { resultado = VAR.getDato(); break; } else { resultado = "Error Semantico."; } } } else { resultado = "Error Semantico, variable especificada no existe."; ErroresSemanticos.Add(resultado); } break; } return(resultado); } catch (Exception e) { resultado = "Error Semantico de tipo de datos."; return(resultado); } }
public static void AccionesMetodo(ParseTreeNode Nodo) { switch (Nodo.Term.Name.ToString()) { case "METODO": ambitollamada = "Metodo " + Nodo.ChildNodes[1].Token.Value.ToString(); AccionesMetodo(Nodo.ChildNodes[6]); break; case "LISTASENTENCIAS": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { AccionesMetodo(Nodo.ChildNodes[i]); } break; case "SENTENCIAS": /*SENTENCIAS.Rule = LLAMADA + tkPUNTOYCOMA | DECLARACION | ASIGNACION | PRINT | IF | WHILE | DO | Empty;*/ for (int i = 0; i < Nodo.ChildNodes.Count; i++) { AccionesMetodo(Nodo.ChildNodes[i]); } break; case "PRINT": //PRINT.Rule = tkPRINT + tkPARA + LEXPRESION + tkPARC + tkPUNTOYCOMA Print = ""; AccionesMetodo(Nodo.ChildNodes[2]); Console.WriteLine(Print); Impresiones.Add(Print); break; case "LEXPRESION": if (Nodo.ChildNodes.Count == 3) //LEXPRESION + tkMAS + OPERACIONES <_------- tengo que cambiar ese mas porque si no me lo toma como que fuera parte de la operacion { AccionesMetodo(Nodo.ChildNodes[0]); String texto = Operaciones(Nodo.ChildNodes[2]); Print += texto; } else if (Nodo.ChildNodes.Count == 1) { String texto = Operaciones(Nodo.ChildNodes[0]); Print += texto; } break; case "IF": acceso1 = ""; bool bandera = false; // IF.Rule = tkIF + tkPARA + CONDICIONES + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC + BLOQUEELSE for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 2) { acceso1 = Condiciones(Nodo.ChildNodes[i]); if (!acceso1.Equals("")) { bandera = Convert.ToBoolean(acceso1); } if (bandera) { Console.WriteLine(acceso1); //acceso permitido lee las sentencias de if } else { i = 6; //acceso denegado salta a las sentencias de else7 } } else { if (bandera && i == 7) { break; } else { AccionesMetodo(Nodo.ChildNodes[i]); } } } break; case "BLOQUEELSE": if (Nodo.ChildNodes.Count > 0) // BLOQUEELSE.Rule = tkELSE + tkLLAVA + LISTASENTENCIAS + tkLLAVC { AccionesMetodo(Nodo.ChildNodes[2]); } break; case "WHILE": acceso1 = ""; bool bandera1 = false; //WHILE.Rule = tkWHILE + tkPARA + CONDICIONES + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 2) { acceso1 = Condiciones(Nodo.ChildNodes[i]); if (!acceso1.Equals("")) { bandera1 = Convert.ToBoolean(acceso1); } if (bandera1 == false) { i = 6; //acceso denegado se salta al ultimo token y se acaba el for y no entrara a las sentencias del while. } } else { if (i == 5 && bandera1) { // se va a aquedar enciclado hasta que la condicion se cumpla. while (bandera1 == true) { AccionesMetodo(Nodo.ChildNodes[i]); i = 0; break; } } else { AccionesMetodo(Nodo.ChildNodes[i]); } } } break; case "DO": acceso1 = ""; bool bandera2 = false; // DO.Rule = tkDO + tkLLAVA + LISTASENTENCIAS + tkLLAVC + tkWHILE + tkPARA + CONDICIONES + tkPARC + tkPUNTOYCOMA for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 6) { acceso1 = Condiciones(Nodo.ChildNodes[i]); if (!acceso1.Equals("")) { bandera2 = Convert.ToBoolean(acceso1); } if (bandera2) { i = 0; } } else { AccionesMetodo(Nodo.ChildNodes[i]); } } break; case "ASIGNACION": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 2) { RESULTADOGENERAL = Operaciones(Nodo.ChildNodes[i]); } else { AccionesMetodo(Nodo.ChildNodes[i]); } } //buscamos el id en mi tabla de simbolos for (int i = 0; i < TS.Count; i++) { Variables Var = (Variables)TS[i]; if (Var.getId().Equals(Id1)) { Var.setDato(RESULTADOGENERAL); } } break; case "LLAMADA": bool existemetodo = false; AccionesMetodo(Nodo.ChildNodes[0]); //solo capturo el id y ya for (int i = 0; i < MT.Count; i++) { Metodos met = (Metodos)MT[i]; if (met.getId().Equals(Id1)) { LLamadaMetodo(Nodo); AccionesMetodo(met.getCuerpo()); existemetodo = true; break; } } if (!existemetodo) { Console.WriteLine("Error Semantico metodo " + Id1 + " no ha sido declarado."); } Id1 = ""; break; #region Declaracion Variables case "DECLARACION": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { AccionesMetodo(Nodo.ChildNodes[i]); } break; case "TIPOVAR": AccionesMetodo(Nodo.ChildNodes[0]); break; case "MASDECLA": if (Nodo.ChildNodes.Count == 2) //tkCOMA + LISTAVARIABLES { //Console.WriteLine(tipo + " " + Id + ";"); TS.Add(new Variables(Id1, tipo1, "", ambitollamada)); Id1 = ""; AccionesMetodo(Nodo.ChildNodes[1]); } else if (Nodo.ChildNodes.Count == 3) //tkIGUAL + OPERACIONES + LISTAVARIABLES { for (int i = 0; i < Nodo.ChildNodes.Count; i++) { if (i == 1) { RESULTADOGENERAL = Operaciones(Nodo.ChildNodes[i]); // Console.WriteLine(tipo + " " + Id + "= " + RESULTADOGENERAL + ";"); TS.Add(new Variables(Id1, tipo1, RESULTADOGENERAL, ambitollamada)); Id = ""; RESULTADOGENERAL = ""; } else { Accion(Nodo.ChildNodes[i]); } } } else //Empty { //Console.WriteLine(tipo + " " + Id + ";"); TS.Add(new Variables(Id1, tipo1, "", ambitollamada)); Id1 = ""; } break; case "LISTAVARIABLES": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { AccionesMetodo(Nodo.ChildNodes[i]); } break; case "VAR": for (int i = 0; i < Nodo.ChildNodes.Count; i++) { AccionesMetodo(Nodo.ChildNodes[i]); } break; case "POSIBLEASIGNACION": if (Nodo.ChildNodes.Count > 0) // POSIBLEASIGNACION = "=" + OPERACIONES { RESULTADOGENERAL = Operaciones(Nodo.ChildNodes[1]); // Console.WriteLine(tipo + " " + Id + "= " + RESULTADOGENERAL + ";"); TS.Add(new Variables(Id1, tipo1, RESULTADOGENERAL, ambitollamada)); Id1 = ""; RESULTADOGENERAL = ""; } else //Empty { // Console.WriteLine(tipo + " " + Id + ";"); TS.Add(new Variables(Id1, tipo1, "", ambitollamada)); Id1 = ""; RESULTADOGENERAL = ""; } break; #endregion #region TERMINALES case "int": case "bool": case "float": tipo1 = Nodo.Token.Value.ToString(); break; case "char": tipo1 = "char*"; break; case "Id": Id1 = Nodo.Token.Value.ToString(); break; #endregion default: // Console.WriteLine(Nodo.Term.Name.ToString()); break; } }