// kdyz vlezu do smeru dolu tak level zvetsim asi a kdyz se vyleze tam zmensit public override int VisitDef_one_function([NotNull] GrammarParser.Def_one_functionContext context) { inFunction = true; localSymbolTable = new SymbolTable(); if (!jmpToMainDone) { DoMainJmp(0); } FuncItem newItem = createFunction(context); if (!globalSymbolTable.ContainsFuncItem(newItem.GetName())) { globalSymbolTable.AddFuncItem(newItem); } else { //Console.WriteLine("Funkce s timhle jmenem uz existuje!\n"); errors.Add("Funkce " + newItem.GetName() + " už existuje!\n"); } AddINT(3 + newItem.GetParameters().Count); level += 1; //inFunctionAddress = 3 + newItem.GetParameters().Count; inFunctionAddress = 3; for (int i = 0; i < newItem.GetParameters().Count; i++) { VarConstItem parItem = new VarConstItem(newItem.GetParameters()[i].getName(), "neni potreba", VarConstType.Var, newItem.GetParameters()[i].getDataType(), inFunctionAddress, 0); localSymbolTable.AddVarConstItem(parItem); inFunctionAddress += 1; } base.VisitDef_one_function(context); level -= 1; Console.WriteLine(localSymbolTable.VarConstToString()); AddRET(0, 0); inFunction = false; localSymbolTable = null; return(456); }
public override int VisitFunction_call([NotNull] GrammarParser.Function_callContext context) { String fName = context.Identifier().GetText(); FuncItem calledFce = null; if (globalSymbolTable.ContainsFuncItem(fName)) { calledFce = globalSymbolTable.GetFuncItemByName(fName); } else { errors.Add("Funkce " + fName + " neexistuje!\n"); Console.WriteLine("Funkce " + fName + " neexistuje!"); } VarConstItem destForVal = retValTo; if (calledFce.GetReturnDataType() != destForVal.GetDataType()) // overeni navratove hodnoty a dat. typu promeny { errors.Add("Navratovy typ funkce se neshoduje s datovym typem promene!\n"); Console.WriteLine("Navratovy typ funkce se neshoduje s datovym typem promene!\n"); } List <VarConstItem> usedParameters = new List <VarConstItem>(); GrammarParser.Par_in_functionContext paramContext = context.par_in_function(); while (paramContext != null) { VarConstItem par = null; if (paramContext.Identifier() != null) { String parName = paramContext.Identifier().GetText(); if (localSymbolTable.ContainsVarConstItem(parName)) { par = localSymbolTable.GetVarConstItemByName(parName); // tohle hodit do metody } else if (globalSymbolTable.ContainsVarConstItem(parName)) { par = globalSymbolTable.GetVarConstItemByName(parName); } else { Console.WriteLine("Parametr neexistuje!"); errors.Add("Parametr neexistuje!"); } } else if (paramContext.Int() != null) { par = new VarConstItem("", paramContext.Int().GetText(), VarConstType.Var, DataType.Int, 0, 0); } else if (paramContext.Bool() != null) { par = new VarConstItem("", paramContext.Bool().GetText(), VarConstType.Var, DataType.Int, 0, 0); } else if (paramContext.Double() != null) { par = new VarConstItem("", paramContext.Double().GetText(), VarConstType.Var, DataType.Int, 0, 0); } if (par != null) { usedParameters.Add(par); } paramContext = paramContext.par_in_function(); } // z tabulky vythnout pozadovane parametry List <FunctionParameter> requestedParameters = calledFce.GetParameters(); if (requestedParameters.Count != usedParameters.Count) { Console.WriteLine("Spatne parametry!"); errors.Add("Spatne parametry"); } for (int i = 0; i < requestedParameters.Count; i++) { if (requestedParameters[i].getDataType() != usedParameters[i].GetDataType()) { Console.WriteLine("Nespravny datovy typ parametru!"); errors.Add("Nespravny datovy typ parametru"); break; } } AddINT(3); for (int i = 0; i < usedParameters.Count; i++) { AddLIT(usedParameters[i].GetValue()); } AddINT(-1 * (3 + usedParameters.Count())); AddCAL(1, calledFce.GetAddress()); base.VisitFunction_call(context); return(451); }
public void AddFuncItem(FuncItem item) { funcTable[item.GetName()] = item; }
/* FUNCKCE */ public Boolean Exists(FuncItem item) { Boolean exist = true; return(exist); }