private void rightSideVarConst(GrammarParser.AssignmentContext context) { String rightSideName = context.Identifier(1).GetText(); VarConstItem rightSideVar = null; if (localSymbolTable.ContainsVarConstItem(rightSideName)) { rightSideVar = localSymbolTable.GetVarConstItemByName(rightSideName); } else if (globalSymbolTable.ContainsVarConstItem(rightSideName)) { rightSideVar = globalSymbolTable.GetVarConstItemByName(rightSideName); } else { Console.WriteLine("Promena na prave strane neexistuje"); } int varLevel = rightSideVar.GetLevel(); int levelToMove = Math.Abs(level - varLevel); AddLOD(levelToMove, rightSideVar.GetAddress()); /*varLevel = retValTo.GetLevel(); * levelToMove = Math.Abs(level - varLevel); * AddSTO(levelToMove, retValTo.GetAddress());*/ }
public override int VisitAssignment([NotNull] GrammarParser.AssignmentContext context) { String retValToName = context.Identifier(0).GetText(); if (localSymbolTable.ContainsVarConstItem(retValToName)) { retValTo = localSymbolTable.GetVarConstItemByName(retValToName); } else if (globalSymbolTable.ContainsVarConstItem(retValToName)) { retValTo = globalSymbolTable.GetVarConstItemByName(retValToName); } else { Console.WriteLine("Promena na levy strane neexistuje"); } if (context.function_call() != null) { Console.WriteLine("PRAVA strana: function"); } else if (context.expression() != null) { Console.WriteLine("PRAVA strana: expression"); } else if (context.Identifier(1) != null) { Console.WriteLine("PRAVA strana: identifier"); rightSideVarConst(context); } else // jinak je na pravo nejaka hodnota int, double, bool { Console.WriteLine("PRAVA strana: int, double, bool hodnota"); rightSideValue(context); } base.VisitAssignment(context); // pokud se neco returnuje, tady muzu resit kam to dat // z VisitFunction_return bude navrcholu zasobniku nejaky cislo, pokud teda bude // tyhle radky maj vsechny prirazeni spolecny, vsechny nechaj na vrcholu neco, co se potom musi storenout nekam (krome kdyz se jen vola fce) // funkce se jeste musi udelat pres tu specialni misto v pameti asi if (retValTo != null) { int varLevel = retValTo.GetLevel(); int varAddress = retValTo.GetAddress(); int levelToMove = Math.Abs(level - varLevel); AddSTO(levelToMove, varAddress); } /*int varLevel = retValTo.GetLevel(); * int levelToMove = Math.Abs(level - varLevel); * AddSTO(levelToMove, retValTo.GetAddress());*/ retValTo = null; return(0); }
// 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 VisitDef_const([NotNull] GrammarParser.Def_constContext context) { VarConstItem newItem = createConst(context); if (inFunction) { if (!localSymbolTable.ContainsVarConstItem(newItem.GetName())) { localSymbolTable.AddVarConstItem(newItem); } else { errors.Add("Promena " + newItem.GetName() + " uz existuje!\n"); Console.WriteLine("Promena " + newItem.GetName() + " uz existuje!\n"); } inFunctionAddress += 1; } else { if (!globalSymbolTable.ContainsVarConstItem(newItem.GetName())) { globalSymbolTable.AddVarConstItem(newItem); } else { errors.Add("Promena " + newItem.GetName() + " uz existuje!\n"); Console.WriteLine("Promena " + newItem.GetName() + " uz existuje!\n"); } globalAddress += 1; } Boolean isNeg = isNegative(newItem.GetValue()); String value = removeUnaryOperator(newItem.GetValue()); AddLIT(value); if (isNeg) { AddOPR(Instruction.UNARY_MINUS); } base.VisitDef_const(context); return(20); }
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 AddVarConstItem(VarConstItem item) { varConstTable[item.GetName()] = item; }