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); }
/// <summary> /// Exit a parse tree produced by <see cref="GrammarParser.par_in_function"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitPar_in_function([NotNull] GrammarParser.Par_in_functionContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="GrammarParser.par_in_function"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitPar_in_function([NotNull] GrammarParser.Par_in_functionContext context) { return(VisitChildren(context)); }