Beispiel #1
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);
        }
Beispiel #2
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);
        }
Beispiel #3
0
 public void AddFuncItem(FuncItem item)
 {
     funcTable[item.GetName()] = item;
 }
Beispiel #4
0
        /* FUNCKCE */

        public Boolean Exists(FuncItem item)
        {
            Boolean exist = true;

            return(exist);
        }