示例#1
0
        public override Tree VisitFuncDeclaration(FuncDeclarationContext context)
        {
            String        name          = context.name.Text;
            ResultContext resultContext = context.result();
            IList <FormalParameterContext> parameterContexts = context._params;
            bool isPrivate = context.isPrivate;

            TypeContext resType = resultContext.type();
            TypeTree    type;

            if (resType != null)
            {
                type = (TypeTree)VisitType(resType);
            }
            else
            {
                //void
                IToken voidToken = resultContext.Start;
                int    len       = voidToken.StopIndex - voidToken.StartIndex;
                type = new PrimitiveTypeNode(voidToken.Line, voidToken.Column, voidToken.Line, voidToken.Column + len,
                                             TypeTag.VOID);
            }

            VariableDeclaration[] parameters = new VariableDeclaration[parameterContexts.Count];
            for (int i = 0; i < parameterContexts.Count; i++)
            {
                parameters[i] = (VariableDeclaration)VisitFormalParameter(parameterContexts[i]);
            }

            Block block = (Block)VisitBlock(context.funcBody().block());

            return(new FuncDef(type.beginLine, type.beginCol, block.endLine, block.endCol, name, type, parameters,
                               block, isPrivate));
        }
示例#2
0
        public override Tree VisitMemberDef(MemberDefContext context)
        {
            FieldDefContext fieldDef = context.fieldDef();

            if (fieldDef != null)
            {
                return(VisitFieldDef(fieldDef));
            }
            FuncDeclarationContext funcDeclaration = context.funcDeclaration();

            return(VisitFuncDeclaration(funcDeclaration));
        }
示例#3
0
        public override Tree VisitDeclaration(DeclarationContext context)
        {
            FuncDeclarationContext func = context.funcDeclaration();

            if (func != null)
            {
                return(VisitFuncDeclaration(func));
            }
            StructDefContext sd = context.structDef();

            if (sd != null)
            {
                return(VisitStructDef(sd));
            }
            throw new ArgumentOutOfRangeException();
        }