Esempio n. 1
0
        public void Call(IAsm a)
        {
            Var     func = a.getVar();
            LibFunc lfunc;

            String funcsig = genDataTypeSig(a.getVar());

            VarList x        = func.getParams();
            String  paramsig = "";

            if (x.Length() > 0)
            {
                int           max = x.Length();
                StringBuilder t   = new StringBuilder(Io.MAXSTR);
                for (int i = 0; i < max; i++)
                {
                    Var e = x.FindByIndex(i);
                    t.Append(genDataTypeSig(e));
                    if (i < max - 1)
                    {
                        t.Append(",");
                    }
                }
                paramsig = t.ToString();
            }

            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            sb.Append("\tcall ");
            sb.Append(funcsig);
            sb.Append(" ");

            lfunc = lib.lookup_func(a.getVar().getName());
            if (lfunc != null)
            {
                sb.Append(lfunc.nameFull);
            }
            else
            {
                sb.Append(io.GetClassname());
                sb.Append("::");
                sb.Append(func.getName());
                sb.Append("(");
                sb.Append(paramsig);
                sb.Append(")");
            }

            sb.Append("\t\t\t\t\t//");
            sb.Append(a.getICount());
            sb.Append("\r\n");
            io.Out(sb.ToString());
        }
Esempio n. 2
0
        public void FuncBegin(IAsm a)
        {
            Var  func    = a.getVar();
            Type funcsig = genDataTypeSig(a.getVar());

            VarList paramlist = func.getParams();

            Type[] paramTypes = null;

            if (paramlist.Length() > 0)
            {
                int max = paramlist.Length();
                paramTypes = new Type[max];
                for (int i = 0; i < max; i++)
                {
                    Var e = paramlist.FindByIndex(i);
                    paramTypes[i] = genDataTypeSig(e);
                }
            }

            emethod = eclass.DefineMethod(func.getName(),
                                          MethodAttributes.Static | MethodAttributes.Public,
                                          funcsig, paramTypes);
            func.setMethodBuilder(emethod);

            for (int i = 0; i < paramlist.Length(); i++)
            {
                emethod.DefineParameter(i + 1, 0, paramlist.FindByIndex(i).getName());
            }

            il = emethod.GetILGenerator();

            if (func.getName().ToLower().Equals("main"))
            {
                appbuild.SetEntryPoint(emethod);
            }
            //    emodule.SetUserEntryPoint(emethod);

            labelhash = new Hashtable();
        }
Esempio n. 3
0
        public void FuncBegin(IAsm a)
        {
            Var    func    = a.getVar();
            String funcsig = genDataTypeSig(a.getVar());

            VarList x        = func.getParams();
            String  paramsig = "";

            if (x.Length() > 0)
            {
                int           max = x.Length();
                StringBuilder t   = new StringBuilder(Io.MAXSTR);
                for (int i = 0; i < max; i++)
                {
                    Var e = x.FindByIndex(i);
                    t.Append(genDataTypeSig(e));
                    if (i < max - 1)
                    {
                        t.Append(",");
                    }
                }
                paramsig = t.ToString();
            }
            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            sb.Append("\t.method public ");
            sb.Append("static ");
            sb.Append(funcsig);
            sb.Append(" ");
            sb.Append(func.getName());
            sb.Append("(");
            sb.Append(paramsig);
            sb.Append(") {\r\n");
            io.Out(sb.ToString());

            if (func.getName().ToLower().Equals("main"))
            {
                io.Out("\t.entrypoint\r\n");
            }
        }
Esempio n. 4
0
File: syn.cs Progetto: master/plil
        void proc_decl(VarList curtree, String label)
        {
            Var procvar = new Var();
            procvar.setName(label);
            procvar.setType(Var.VAR_BLOCK);
            procvar.setTypeId(Tok.TOK_VOID);

            if (label == null) io.Abort("PL0116: PROC declaration needs LABEL");
            io.Message(tok+"[PROC]");

            tok.scan();
            procvar.nodes = new VarList();

            if (tok.getId() == Tok.TOK_1_LBRACKET) {
                param(procvar.nodes);
                procvar.setNodesType(Var.VAR_PARAM);
            }

            switch (tok.getId()) {
            case Tok.TOK_RETURNS:
                io.Message(tok+"[RETURNS]");
                tok.scan();
                if (tok.getId() != Tok.TOK_1_LBRACKET)	io.Abort("PL0104: ')' expected.");
                io.Message(tok+"[(]");
                tok.scan();
                switch (tok.getId()) {
                    case Tok.TOK_FIXED:
                    case Tok.TOK_FLOAT:
                    case Tok.TOK_COMPLEX:
                    case Tok.TOK_REAL:
                    case Tok.TOK_BINARY:
                    case Tok.TOK_DECIMAL:
                        io.Message(tok+"[Type]");
                        procvar.setTypeId(tok.getId());
                        break;
                    default:
                        io.Abort("PL0115: type specifier expected");
                        break;
                }
                tok.scan();
                if (tok.getId() != Tok.TOK_1_RBRACKET) io.Abort("PL0114: ')' expected");
                io.Message(tok+"[)]");
                tok.scan();
                break;
            case Tok.TOK_RECURSIVE:
                io.Message(tok+"[RECURSIVE]");
                if (label.ToUpper() == "MAIN") io.Abort("PL0146: MAIN can not be RECURSIVE");
                tok.scan();
                break;

            }

            null_stmt();

            emit.FuncBegin(procvar);

            declarations(procvar.nodes);

            VarList prms = procvar.getParams();
            if (prms != null)
                for (int i = 0; i < prms.Length(); i++)
                    if (prms.FindByIndex(i).getTypeId() == 0)
                        io.Abort("PL0117: undeclared parameter");

            if (procvar.getLocals() != null) {
                emit.LocalVars(procvar.getLocals());
            }

            try
            {
                curtree.add(procvar);
            }
            catch
            {
                io.Abort("PL0120: invalid procedure declaration");
            }

            do {
                stmt(procvar.nodes, label, null);
            } while (tok.getId() != Tok.TOK_END);

            if (tok.getId() != Tok.TOK_END) io.Abort("PL0118: END expected");
            io.Message(tok+"[END]");
            tok.scan();

            if (tok.getValue() != label) io.Abort("PL0119: unclosed PROC");
            io.Message(tok+"[Label]");

            tok.scan();

            emit.Ret();
            emit.FuncEnd();

            if (io.getGenList()) emit.LIST();
            emit.IL();

            emit.Finish();
        }
Esempio n. 5
0
        void proc_decl(VarList curtree, String label)
        {
            Var procvar = new Var();

            procvar.setName(label);
            procvar.setType(Var.VAR_BLOCK);
            procvar.setTypeId(Tok.TOK_VOID);

            if (label == null)
            {
                io.Abort("PL0116: PROC declaration needs LABEL");
            }
            io.Message(tok + "[PROC]");

            tok.scan();
            procvar.nodes = new VarList();

            if (tok.getId() == Tok.TOK_1_LBRACKET)
            {
                param(procvar.nodes);
                procvar.setNodesType(Var.VAR_PARAM);
            }

            switch (tok.getId())
            {
            case Tok.TOK_RETURNS:
                io.Message(tok + "[RETURNS]");
                tok.scan();
                if (tok.getId() != Tok.TOK_1_LBRACKET)
                {
                    io.Abort("PL0104: ')' expected.");
                }
                io.Message(tok + "[(]");
                tok.scan();
                switch (tok.getId())
                {
                case Tok.TOK_FIXED:
                case Tok.TOK_FLOAT:
                case Tok.TOK_COMPLEX:
                case Tok.TOK_REAL:
                case Tok.TOK_BINARY:
                case Tok.TOK_DECIMAL:
                    io.Message(tok + "[Type]");
                    procvar.setTypeId(tok.getId());
                    break;

                default:
                    io.Abort("PL0115: type specifier expected");
                    break;
                }
                tok.scan();
                if (tok.getId() != Tok.TOK_1_RBRACKET)
                {
                    io.Abort("PL0114: ')' expected");
                }
                io.Message(tok + "[)]");
                tok.scan();
                break;

            case Tok.TOK_RECURSIVE:
                io.Message(tok + "[RECURSIVE]");
                if (label.ToUpper() == "MAIN")
                {
                    io.Abort("PL0146: MAIN can not be RECURSIVE");
                }
                tok.scan();
                break;
            }

            null_stmt();

            emit.FuncBegin(procvar);

            declarations(procvar.nodes);

            VarList prms = procvar.getParams();

            if (prms != null)
            {
                for (int i = 0; i < prms.Length(); i++)
                {
                    if (prms.FindByIndex(i).getTypeId() == 0)
                    {
                        io.Abort("PL0117: undeclared parameter");
                    }
                }
            }

            if (procvar.getLocals() != null)
            {
                emit.LocalVars(procvar.getLocals());
            }

            try
            {
                curtree.add(procvar);
            }
            catch
            {
                io.Abort("PL0120: invalid procedure declaration");
            }

            do
            {
                stmt(procvar.nodes, label, null);
            } while (tok.getId() != Tok.TOK_END);

            if (tok.getId() != Tok.TOK_END)
            {
                io.Abort("PL0118: END expected");
            }
            io.Message(tok + "[END]");
            tok.scan();

            if (tok.getValue() != label)
            {
                io.Abort("PL0119: unclosed PROC");
            }
            io.Message(tok + "[Label]");

            tok.scan();

            emit.Ret();
            emit.FuncEnd();

            if (io.getGenList())
            {
                emit.LIST();
            }
            emit.IL();

            emit.Finish();
        }