public bool LookUpContructor(CLASSMEMBER obj) { for (int j = 0; j < globalSymbolTable[globalSymbolTable.Count - 1].classes.Count; j++) { if (globalSymbolTable.Last().classes[j].name == obj.type) { foreach (CLASSMEMBER i in globalSymbolTable.Last().classes[j].members) { if (obj.type == i.name) { string memberParam = i.param; string objParam = obj.param; if (objParam == memberParam) { return(true); } } } if (obj.param == "") { return(true); } } } return(false); }
public bool insertConstructor(CLASSMEMBER obj) { if (obj.name == globalSymbolTable.Last().classes.Last().name) { bool RT = insertMember(obj); return(RT); } else { errors.Add("Constructor Redeclaration " + obj.name + " " + obj.param + " " + obj.type); //obj.name = "ERROR-" + obj.name; //insertMember(obj); return(false); } }
public bool LookUpMember(CLASSMEMBER obj) { bool paramNotMatch = false; if (obj.isMethod) { for (int i = 0; i < globalSymbolTable.Last().classes.Last().members.Count; i++) { if (globalSymbolTable.Last().classes.Last().members[i].isMethod && globalSymbolTable.Last().classes.Last().members[i].name == obj.name) { string memberParam = globalSymbolTable.Last().classes.Last().members[i].param; string objParam = obj.param; if (objParam == memberParam) { paramNotMatch = true; } else { paramNotMatch = false; break; } } } if (paramNotMatch) { return(true); } else { return(false); } } else { for (int i = 0; i < globalSymbolTable.Last().classes.Last().members.Count; i++) { if (!globalSymbolTable.Last().classes.Last().members[i].isMethod && globalSymbolTable.Last().classes.Last().members[i].name == obj.name) { return(true); } } } return(false); }
public bool insertMember(CLASSMEMBER obj) { CLASSMEMBER currentMember = (CLASSMEMBER)obj.ShallowCopy(); if (LookUpMember(currentMember)) { errors.Add("Method Redeclaration Error " + currentMember.name + " " + currentMember.param + " " + currentMember.type); //currentMember.name = "ERROR-" + currentMember.name; //globalSymbolTable.Last().classes.Last().members.Add(currentMember); return(false); } else { globalSymbolTable.Last().classes.Last().members.Add(currentMember); return(true); } }
public string SearchMember(string classType, CLASSMEMBER obj) { for (int i = 0; i < globalSymbolTable.Last().classes.Count; i++) { if (globalSymbolTable.Last().classes[i].name == classType) { CLASS currentClass = globalSymbolTable.Last().classes[i]; for (int j = 0; j < currentClass.members.Count; j++) { if (currentClass.members[j].name == obj.name) { CLASSMEMBER currentMember = currentClass.members[j]; if (!obj.isMethod && !currentMember.isMethod) // check if both obj and currentMember are feilds of a class , NOT METHOD { obj.type = currentMember.type; return(obj.type); } else if (obj.isMethod && currentMember.isMethod) // check if both obj and currentMember are methods of a class , NOT feilds { if (obj.param == currentMember.param) { obj.type = currentMember.type; return(obj.type); } } else { return("invalid"); } } } return("invalid"); } } return("invalid"); }
private bool obj_arr_dec2() { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<obj_arr_dec2>) = { new , Null} if (tokenList[index].classStr == Singleton.SingletonEnums._new.ToString()) { //<obj_arr_dec2> new ID (<Param>)<obj_arr_dec3> | null if (tokenList[index].classStr == Singleton.SingletonEnums._new.ToString()) { index++; if (tokenList[index].classStr == Singleton.nonKeywords.IDENTIFIER.ToString()) { string N = tokenList[index].wordStr; if (!semanticAnalyzer.LookUpClass(N)) { addError("Class unspecified"); } index++; if (tokenList[index].classStr == "(") { string PL = "", AL = "", NPL = "", NAL = ""; index++; if (Param(ref AL, PL, ref NAL, NPL)) { if (tokenList[index].classStr == ")") { CLASSMEMBER cm = new CLASSMEMBER(); cm.accessModifier = Singleton.defaultAccessModifier; cm.name = N; cm.type = N; cm.isMethod = false; cm.param = AL; if (semanticAnalyzer.LookUpContructor(cm)) { addError("Constructor Not Found"); } index++; if (obj_arr_dec3()) { currentNode = currentNode.Parent; return true; } } } } } } } ///FOLLOW(<obj_arr_dec2>) = { access_modifier , static, DT , void , ID , class , jabtak , barbar , agar , return , inc_dec , ///break , continue , this ,} } else if (tokenList[index].classStr == Singleton.SingletonEnums._Access_Modifier.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._static.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._DT.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._void.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._class.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._jabtak.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._barbar.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._agar.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._return.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._break.ToString() || tokenList[index].classStr == Singleton.SingletonEnums.IncDec.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._continue.ToString() || tokenList[index].classStr == Singleton.SingletonEnums._this.ToString()) { currentNode = currentNode.Parent; return true; } currentNode = currentNode.Parent; return false; }
private bool Object_Creation_Exp(string N, string N1, string AM) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<Object_Creation_Exp>) = {= , , , ;} //FIRST(<Object_Creation_Exp>) = {= , ;} if (tokenList[index].wordStr == "=" || tokenList[index].classStr == ";") { //<Object_Creation_Exp> = new ID (<List_Const>) <Object_List> |<Object_List> //<Object_Creation_Exp> = new ID (<Param>) <Object_List> |; if (tokenList[index].wordStr == "=") { index++; if (tokenList[index].classStr == Singleton.SingletonEnums._new.ToString()) { index++; if (tokenList[index].classStr == Singleton.nonKeywords.IDENTIFIER.ToString()) { string N2 = tokenList[index].wordStr; if (!semanticAnalyzer.LookUpClass(N2)) { addError("Class unspecified"); } index++; if (tokenList[index].classStr == "(") { index++; string PL = "", AL = "", NAL="",NPL=""; if (Param(ref AL, PL, ref NAL, NPL)) { if (tokenList[index].classStr == ")") { if (N != N2) { addError(N + " is not equal " + N2); } else { CLASSMEMBER cm = new CLASSMEMBER(); cm.accessModifier = AM; cm.name = N1; cm.type = N; cm.isMethod = false; cm.param = AL; if (semanticAnalyzer.LookUpContructor(cm)) { if (isMethodStart) { semanticAnalyzer.insertVariables(N1, N, semanticAnalyzer.currentScope()); } else { //cm.param = ""; semanticAnalyzer.insertMember(cm); } } else { addError("Constructor not found in class " + N); } } index++; if (Object_List(N, AM)) { currentNode = currentNode.Parent; return true; } } } } } } } } currentNode = currentNode.Parent; return false; }
private bool object_array_dec(string N, string N1, string AM) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<object_array_dec>) = { = } if (tokenList[index].wordStr == "=") { //<object_array_dec> = new ID[<Exp>]<obj_arr_dec1> if (tokenList[index].wordStr == "=") { index++; if (tokenList[index].classStr == Singleton.SingletonEnums._new.ToString()) { index++; if (tokenList[index].classStr == Singleton.nonKeywords.IDENTIFIER.ToString()) { string N2 = tokenList[index].wordStr; if (!semanticAnalyzer.LookUpClass(N2)) { addError("Class unspecified"); } index++; if (tokenList[index].classStr == "[") { currentNode.Nodes.Add("(" + tokenList[index].classStr + ")", "( " + tokenList[index].classStr + " )"); //currentNode = currentNode.Parent; index++; string ET = ""; string NET = ""; if (Exp(ref ET, ref NET)) { if (tokenList[index].classStr == "]") { currentNode.Nodes.Add("(" + tokenList[index].classStr + ")", "( " + tokenList[index].classStr + " )"); // currentNode = currentNode.Parent; index++; if (isMethodStart) { semanticAnalyzer.insertVariables(N, N1, semanticAnalyzer.currentScope()); } else { CLASSMEMBER cm = new CLASSMEMBER(); cm.accessModifier = AM; cm.name = N; cm.type = N1; cm.isMethod = false; cm.param = ""; semanticAnalyzer.insertMember(cm); } //semanticAnalyzer.insertVariables(N, N1, semanticAnalyzer.currentScope(), AM, ""); if (obj_arr_dec1()) { currentNode = currentNode.Parent; return true; } } } } } } } } currentNode = currentNode.Parent; return false; }
private bool Method_Link3(string AM, string TM, string RT, string N) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<Method_Link 3>) = { ( } if (tokenList[index].classStr == "(") { //<Method_Link 3> (<List_Param>) {<M_St>} if (tokenList[index].classStr == "(") { index++; string PL = "", NPL = "" ; string AL = "", NAL = "" ; if (List_Param(ref AL, PL, ref NAL, NPL)) { if (tokenList[index].classStr == ")") { index++; CLASSMEMBER mem = new CLASSMEMBER(); mem.isMethod = true; mem.name = N; mem.type = RT; mem.param = AL; mem.accessModifier = AM; semanticAnalyzer.insertMember(mem); if (AL != "") { string[] splitOp = { "," }; string[] ALArr = AL.Split(splitOp, StringSplitOptions.None); string[] NALArr = NAL.Split(splitOp, StringSplitOptions.None); for (int i = 0; i < ALArr.Length; i++) { semanticAnalyzer.insertVariables(NALArr[i], ALArr[i], semanticAnalyzer.currentScope()); } } isMethodStart = true; if (tokenList[index].classStr == "{") { index++; semanticAnalyzer.createScope(); if (AL != "") { string[] splitOp = { "," }; string[] ALArr = AL.Split(splitOp, StringSplitOptions.None); string[] NALArr = NAL.Split(splitOp, StringSplitOptions.None); for (int i = ALArr.Length - 1; i >= 0; i--) { icg.GenerateCode("pop " + NALArr[i]); } } icg.GenerateCode(semanticAnalyzer.getCurrentClass() + "_" + N + "_" + AL +" Proc"); string MT = ""; if (M_ST()) { //if (RT == "" || RT == "void") //{ // if (!(MT == "" || MT == "void")) // { // addError("Return type error"); // } //} //else //{ // if (MT != RT) // { // addError("Return Type Error"); // } //} Console.WriteLine("MT = " + MT); Console.WriteLine("RT = " + RT); if (tokenList[index].classStr == "}") { isMethodStart = false; semanticAnalyzer.deleteScope(); icg.GenerateCode(semanticAnalyzer.getCurrentClass() + "_" + N + "_" + AL + " endP"); index++; currentNode = currentNode.Parent; return true; } } } } } } } currentNode = currentNode.Parent; return false; }
/*LEFT*/ private bool Method_Call_1(ref string RT, string N) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<Method_Call_1>) = { ( } if (tokenList[index].classStr == "(") { //<Method_Call_1> (<Param>) if (tokenList[index].classStr == "(") { string AL = "", NAL = ""; string PL = "", NPL = ""; index++; if (Param(ref AL, PL, ref NAL, NPL)) { if (AL != "") { string[] splitOp = { "," }; string[] ALArr = AL.Split(splitOp, StringSplitOptions.None); string[] NALArr = NAL.Split(splitOp, StringSplitOptions.None); for (int i = 0; i < NALArr.Length; i++) { icg.GenerateCode("param " + NALArr[i]); } } if (isObjectCalling) { icg.GenerateCode("call " + OC + "_" + N + "_" + AL); } else { icg.GenerateCode("call " + semanticAnalyzer.getCurrentClass() + "_" + N + "_" + AL); } if (tokenList[index].classStr == ")") { //RT = Search_GetType(N, "Undeclared Method"); CLASSMEMBER cm = new CLASSMEMBER(); cm.name = N; cm.param = AL; cm.isMethod = true; if (!isObjectCalling) { RT = semanticAnalyzer.SearchMember(semanticAnalyzer.getCurrentClass(), cm); } else { RT = semanticAnalyzer.SearchMember(OC, cm); } if (RT == "invalid") { addError("Undeclared Method"); } index++; currentNode = currentNode.Parent; return true; } } } } currentNode = currentNode.Parent; return false; }
private bool ID_1(string AM, string RT, string N) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<ID_1>) = {( , =} //TEMP //FIRST(<ID_1>) = {( , AOP , , , ; } if (tokenList[index].classStr == "(" || tokenList[index].classStr == Singleton.SingletonEnums.AssignmentOp.ToString() || tokenList[index].classStr == "," || tokenList[index].classStr == ";") { //<ID_1><Varaiable_Link2> | <Method_Link 3> if (Variable_Link2(RT, N)) { CLASSMEMBER cm = new CLASSMEMBER(); cm.accessModifier = Singleton.defaultAccessModifier; cm.name = N; cm.type = RT; cm.isMethod = false; cm.param = ""; semanticAnalyzer.insertMember(cm); currentNode = currentNode.Parent; return true; } else if (Method_Link3(AM, "", RT, N)) { currentNode = currentNode.Parent; return true; } } currentNode = currentNode.Parent; return false; }
public bool insertMember(CLASSMEMBER obj) { CLASSMEMBER currentMember = (CLASSMEMBER)obj.ShallowCopy(); if (LookUpMember(currentMember)) { errors.Add("Method Redeclaration Error " + currentMember.name + " " + currentMember.param + " " + currentMember.type); //currentMember.name = "ERROR-" + currentMember.name; //globalSymbolTable.Last().classes.Last().members.Add(currentMember); return false; } else { globalSymbolTable.Last().classes.Last().members.Add(currentMember); return true; } }
public string SearchMember(string classType, CLASSMEMBER obj) { for (int i = 0; i < globalSymbolTable.Last().classes.Count; i++) { if (globalSymbolTable.Last().classes[i].name == classType) { CLASS currentClass = globalSymbolTable.Last().classes[i]; for (int j = 0; j < currentClass.members.Count; j++) { if (currentClass.members[j].name == obj.name) { CLASSMEMBER currentMember = currentClass.members[j]; if (!obj.isMethod && !currentMember.isMethod) // check if both obj and currentMember are feilds of a class , NOT METHOD { obj.type = currentMember.type; return obj.type; } else if (obj.isMethod && currentMember.isMethod) // check if both obj and currentMember are methods of a class , NOT feilds { if (obj.param == currentMember.param) { obj.type = currentMember.type; return obj.type; } } else { return "invalid"; } } } return "invalid"; } } return "invalid"; }
public bool LookUpMember(CLASSMEMBER obj) { bool paramNotMatch = false; if (obj.isMethod) { for (int i = 0; i < globalSymbolTable.Last().classes.Last().members.Count; i++) { if (globalSymbolTable.Last().classes.Last().members[i].isMethod && globalSymbolTable.Last().classes.Last().members[i].name == obj.name) { string memberParam = globalSymbolTable.Last().classes.Last().members[i].param; string objParam = obj.param; if (objParam == memberParam) { paramNotMatch = true; } else { paramNotMatch = false; break; } } } if (paramNotMatch) { return true; } else { return false; } } else { for (int i = 0; i < globalSymbolTable.Last().classes.Last().members.Count; i++) { if (!globalSymbolTable.Last().classes.Last().members[i].isMethod && globalSymbolTable.Last().classes.Last().members[i].name == obj.name) { return true; } } } return false; }
public bool LookUpContructor(CLASSMEMBER obj) { for (int j = 0; j < globalSymbolTable[globalSymbolTable.Count - 1].classes.Count; j++) { if (globalSymbolTable.Last().classes[j].name == obj.type) { foreach (CLASSMEMBER i in globalSymbolTable.Last().classes[j].members) { if (obj.type == i.name) { string memberParam = i.param; string objParam = obj.param; if (objParam == memberParam) { return true; } } } if (obj.param == "") { return true; } } } return false; }
private bool Array_DEC(string AM, string TM, string RT) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<Array_DEC>) = {[} if (tokenList[index].classStr == "[") { //<Array_DEC> [] ID <INIT_Array> if (tokenList[index].classStr == "[") { currentNode.Nodes.Add("(" + tokenList[index].classStr + ")", "( " + tokenList[index].classStr + " )"); //currentNode = currentNode.Parent; index++; if (tokenList[index].classStr == "]") { currentNode.Nodes.Add("(" + tokenList[index].classStr + ")", "( " + tokenList[index].classStr + " )"); //currentNode = currentNode.Parent; index++; RT += "[]"; if (tokenList[index].classStr == Singleton.nonKeywords.IDENTIFIER.ToString()) { string N = tokenList[index].wordStr; index++; if (isMethodStart) { semanticAnalyzer.insertVariables(N, RT, semanticAnalyzer.currentScope()); } else { CLASSMEMBER cm = new CLASSMEMBER(); cm.name = N; cm.type = RT; cm.isMethod = false; cm.category = TM; cm.param = ""; semanticAnalyzer.insertMember(cm); } //semanticAnalyzer.insertVariables(N, RT, semanticAnalyzer.currentScope()); //semanticAnalyzer.insertVariables(N, RT, semanticAnalyzer.currentScope()); if (INIT_Array(RT)) { currentNode = currentNode.Parent; return true; } } } } } currentNode = currentNode.Parent; return false; }
private bool Constructor_DEC(string AM, string N) { currentNode = currentNode.Nodes.Add("<" + System.Reflection.MethodBase.GetCurrentMethod().Name + ">", "< " + System.Reflection.MethodBase.GetCurrentMethod().Name + " >"); //FIRST(<Constructor_DEC>) = {ID} //FIRST(<Constructor_DEC>) = { ( } if (tokenList[index].classStr == "(") { //<Constructor_DEC> ID (<List_Param>) {<M-St>} //<Constructor_DEC> (<List_Param>) {<M-St>} if (tokenList[index].classStr == "(") { string AL = "", PL = "", NAL = "", NPL = ""; index++; if (List_Param(ref AL, PL, ref NAL, NPL)) { if (tokenList[index].classStr == ")") { CLASSMEMBER cons = new CLASSMEMBER(); cons.name = N; cons.type = semanticAnalyzer.getCurrentClass(); cons.param = AL; cons.isMethod = true; cons.accessModifier = AM; semanticAnalyzer.insertConstructor(cons); if (AL != "") { string[] splitOp = { "," }; string[] ALArr = AL.Split(splitOp, StringSplitOptions.None); string[] NALArr = NAL.Split(splitOp, StringSplitOptions.None); for (int i = 0; i < ALArr.Length; i++) { semanticAnalyzer.insertVariables(NALArr[i], ALArr[i], semanticAnalyzer.currentScope()); } } index++; if (tokenList[index].classStr == "{") { index++; semanticAnalyzer.createScope(); string MT = ""; if (M_ST()) { if (tokenList[index].classStr == "}") { index++; semanticAnalyzer.deleteScope(); currentNode = currentNode.Parent; return true; } } } } } } } currentNode = currentNode.Parent; return false; }
public bool insertConstructor(CLASSMEMBER obj) { if (obj.name == globalSymbolTable.Last().classes.Last().name) { bool RT = insertMember(obj); return RT; } else { errors.Add("Constructor Redeclaration " + obj.name + " " + obj.param + " " + obj.type); //obj.name = "ERROR-" + obj.name; //insertMember(obj); return false; } }