Example #1
0
        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);
        }
Example #2
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="GrammarParser.function_call"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitFunction_call([NotNull] GrammarParser.Function_callContext context)
 {
 }
Example #3
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="GrammarParser.function_call"/>.
 /// <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 VisitFunction_call([NotNull] GrammarParser.Function_callContext context)
 {
     return(VisitChildren(context));
 }