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
        private FuncItem createFunction(GrammarParser.Def_one_functionContext context)
        {
            String   name                       = context.Identifier().GetText();;
            DataType returnDataType             = DataType.Int;
            List <FunctionParameter> parameters = new List <FunctionParameter>();

            if (context.function_return_data_typ().Data_type_void() != null)
            {
                returnDataType = DataType.Void;
            }
            else if (context.function_return_data_typ().data_type().Data_type_bool() != null)
            {
                returnDataType = DataType.Bool;
            }
            else if (context.function_return_data_typ().data_type().Data_type_double() != null)
            {
                returnDataType = DataType.Double;
            }

            GrammarParser.ParametersContext paramContext = context.parameters();
            while (paramContext != null && paramContext.Identifier() != null)
            {
                DataType dType = DataType.Int;
                if (paramContext.data_type().Data_type_double() != null)
                {
                    dType = DataType.Double;
                }
                else if (paramContext.data_type().Data_type_bool() != null)
                {
                    dType = DataType.Bool;
                }

                parameters.Add(new FunctionParameter(paramContext.Identifier().GetText(), dType));
                paramContext = paramContext.parameters();
            }

            return(new FuncItem(name, returnDataType, instructionCount, parameters));
        }
Beispiel #3
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="GrammarParser.def_one_function"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitDef_one_function([NotNull] GrammarParser.Def_one_functionContext context)
 {
 }
Beispiel #4
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="GrammarParser.def_one_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 VisitDef_one_function([NotNull] GrammarParser.Def_one_functionContext context)
 {
     return(VisitChildren(context));
 }