コード例 #1
0
        void assign_stmt(VarList curtree)               // Should be rewrited
        {
            VarList vars = new VarList();
            int     i;

            var_list(vars);

            if (tok.getId() != Tok.TOK_1_EQUALS)
            {
                io.Abort("PL0121: '=' expected");
            }
            for (i = 0; i < vars.Length(); i++)
            {
                if (curtree.FindByName(vars.FindByIndex(i).getName()) == null)
                {
                    io.Abort("PL0122: undeclared variable");
                }
            }
            io.Message(tok + "[Equals]");
            tok.scan();
            bool_expr(0);
            for (i = 0; i < vars.Length(); i++)
            {
                emit.Store(curtree.FindByName(vars.FindByIndex(i).getName()));
                if (i < vars.Length() - 1)
                {
                    emit.Load(curtree.FindByName(vars.FindByIndex(0).getName()));
                }
            }
        }
コード例 #2
0
ファイル: asm.cs プロジェクト: stjordanis/plil
        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());
        }
コード例 #3
0
ファイル: var.cs プロジェクト: stjordanis/plil
        public VarList getNodes(int Type)
        {
            VarList val = new VarList();
            int     i;

            for (i = 0; i < nodes.Length(); i++)
            {
                if ((nodes.FindByIndex(i).type & Type) != 0)
                {
                    val.add(nodes.FindByIndex(i));
                }
            }
            return(val);
        }
コード例 #4
0
ファイル: var.cs プロジェクト: master/plil
 public void addNodes(VarList p)
 {
     int i;
     for (i=0;i<p.Length();i++) {
         nodes.add(p.FindByIndex(i));
     }
 }
コード例 #5
0
        public void addNodes(VarList p)
        {
            int i;

            for (i = 0; i < p.Length(); i++)
            {
                add(p.FindByIndex(i));
            }
        }
コード例 #6
0
ファイル: asm.cs プロジェクト: stjordanis/plil
        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");
            }
        }
コード例 #7
0
ファイル: exe.cs プロジェクト: stjordanis/plil
        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();
        }
コード例 #8
0
ファイル: exe.cs プロジェクト: stjordanis/plil
        public void LocalVars(VarList v)
        {
            int max = v.Length();

            for (int i = 0; i < max; i++)
            {
                Var          e  = v.FindByIndex(i);
                Type         et = genDataTypeSig(e);
                LocalBuilder t  = il.DeclareLocal(et);
                if (io.getGenDebug())
                {
                    t.SetLocalSymInfo(e.getName());
                }
                e.setLocalToken(t);
            }
            localvars = v;
        }
コード例 #9
0
ファイル: asm.cs プロジェクト: stjordanis/plil
        public void LocalVars(VarList v)
        {
            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            sb.Append("\t.locals (");
            int max = v.Length();

            for (int i = 0; i < max; i++)
            {
                Var    e     = v.FindByIndex(i);
                String stype = "";
                switch (e.getTypeId())
                {
                case Tok.TOK_FIXED:             stype = "int32"; break;

                case Tok.TOK_FLOAT:             stype = "float32"; break;

                case Tok.TOK_COMPLEX:   stype = "float64"; break;

                case Tok.TOK_REAL:              stype = "float32"; break;

                case Tok.TOK_BINARY:    stype = "int16"; break;

                case Tok.TOK_DECIMAL:   stype = "int32"; break;

                default:
                    io.Abort("PL0406: could not find type for local");
                    break;
                }
                sb.Append(stype);
                if (i < max - 1)
                {
                    sb.Append(",");
                }
            }

            sb.Append(")\r\n");
            io.Out(sb.ToString());
        }
コード例 #10
0
        public void mergeNodes(VarList p)
        {
            int i;

            for (i = 0; i < p.Length(); i++)
            {
                Var varSrc = p.FindByIndex(i);
                Var varTrg = FindByName(varSrc.getName());
                if ((varTrg != null) && (varTrg.getType() != Var.VAR_PARAM))
                {
                    add(varSrc);
                }
                else
                if (varTrg == null)
                {
                    add(varSrc);
                }
                else
                {
                    FindByName(varSrc.getName()).setTypeId(varSrc.getTypeId());
                    FindByName(varSrc.getName()).setGranularity(varSrc.getGranularity());
                }
            }
        }
コード例 #11
0
ファイル: syn.cs プロジェクト: master/plil
        void assign_stmt(VarList curtree)
        {
            // Should be rewrited
            VarList vars = new VarList();
            int i;
            var_list(vars);

            if (tok.getId() != Tok.TOK_1_EQUALS) io.Abort("PL0121: '=' expected");
            for (i = 0; i < vars.Length(); i ++) {
                if (curtree.FindByName(vars.FindByIndex(i).getName()) == null) io.Abort("PL0122: undeclared variable");
            }
            io.Message(tok+"[Equals]");
            tok.scan();
            bool_expr(0);
            for (i = 0; i < vars.Length(); i ++) {
                emit.Store(curtree.FindByName(vars.FindByIndex(i).getName()));
                if (i < vars.Length() -1)
                    emit.Load(curtree.FindByName(vars.FindByIndex(0).getName()));
            }
        }
コード例 #12
0
ファイル: syn.cs プロジェクト: master/plil
        void ident_stmt(VarList curtree)
        {
            Tok s = new Tok(null);
            VarList vars = new VarList();
            Var V;
            int gotType = Tok.TOK_BINARY;

            s.setValue(tok.getValue());
            s.setId(tok.getId());
            tok.scan();

            switch (tok.getId()) {
            case Tok.TOK_1_EQUALS:
                if (curtree.FindByName(s.getValue()) == null) io.Abort("PL0137: undeclared variable");
                V = new Var(); V.setName(s.getValue()); vars.add(V);
                io.Message(s+"[Variable]");
                io.Message(tok+"[Equals]");
                tok.scan();
                gotType = bool_expr(0);
                typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId());
                null_stmt();
                break;
            case Tok.TOK_1_COMMA:
                io.Message(s+"[Variable]");
                if (curtree.FindByName(s.getValue()) == null) io.Abort("PL0137: undeclared variable");
                V = new Var(); V.setName(s.getValue()); vars.add(V);
                while (tok.getId() != Tok.TOK_1_EQUALS)	{
                    if (tok.getFirstChar() != ',') io.Abort("PL0138: ',' or '=' expected");
                    io.Message(tok+"[Comma]");
                    tok.scan();

                    if (tok.getId() != Tok.TOK_IDENT) io.Abort("PL0139: ident expected");
                    if (curtree.FindByName(tok.getValue()) == null) io.Abort("PL0137: undeclared variable");
                    V = new Var(); V.setName(tok.getValue()); vars.add(V);
                    io.Message(tok+"[Variable]");
                    tok.scan();
                }
                io.Message(tok+"[Assign]");
                tok.scan();
                gotType = bool_expr(0);
                typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId());
                null_stmt();
                break;
            case Tok.TOK_1_REL:
                label(s);
                break;
            default:
                io.Abort("PL0140: not found expected token ':', ',' or '='");
                break;
            }

            for (int i = 0; i < vars.Length(); i ++) {
                typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(i).getName()).getTypeId());
                emit.Store(curtree.FindByName(vars.FindByIndex(i).getName()));
                if (i < vars.Length() -1)
                    emit.Load(curtree.FindByName(vars.FindByIndex(0).getName()));
            }
        }
コード例 #13
0
ファイル: syn.cs プロジェクト: master/plil
        void do_stmt(VarList curtree)
        {
            bool needBranch = true;

            String label1 = new_label(); // loop start
            String label2 = new_label(); // loop end
            String label3 = new_label();
            String label4 = new_label();

            Var procvar = new Var();
            procvar.setName(curtree.genName());
            procvar.setType(Var.VAR_BLOCK);
            procvar.nodes = new VarList();

            for (int i=0; i<curtree.Length(); i++)
                if ((curtree.FindByIndex(i).type & (Var.VAR_LOCAL|Var.VAR_PARAM|Var.VAR_LABEL)) != 0)
                    procvar.add(curtree.FindByIndex(i));

            io.Message(tok+"[DO]");
            tok.scan();
            switch (tok.getId())
            {
                case Tok.TOK_WHILE:
                    io.Message(tok+"[WhileStatement]");
                    emit.Label(label1);
                    tok.scan();
                    bool_expr(0);
                    null_stmt();
                    emit.Branch("brfalse", label2);
                    break;
                case Tok.TOK_IDENT:				// TODO
                    assign_stmt(curtree);
                    if (tok.getId() != Tok.TOK_TO) io.Abort("PL0123: TO expected");
                    tok.scan();
                    bool_expr(0);
                    null_stmt();
                    break;
                case Tok.TOK_CASE:
                    io.Message(tok+"[CaseStatement]");
                    tok.scan();
                    break;
                case Tok.TOK_1_SEMI:
                    io.Message(tok+"[;]");
                    needBranch = false;
                    tok.scan();
                    break;
            }

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

            if (needBranch) emit.Branch("br", label1);

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

            tok.scan();
            curtree.add(procvar);

            if (needBranch) emit.Label(label2);
        }
コード例 #14
0
ファイル: exe.cs プロジェクト: master/plil
        public void LocalVars(VarList v)
        {
            int max = v.Length();

            for (int i = 0; i < max; i++) {
                Var e = v.FindByIndex(i);
                Type et = genDataTypeSig(e);
                LocalBuilder t = il.DeclareLocal(et);
                if (io.getGenDebug()) t.SetLocalSymInfo(e.getName());
                e.setLocalToken(t);
            }
            localvars = v;
        }
コード例 #15
0
        void ident_stmt(VarList curtree)
        {
            Tok     s    = new Tok(null);
            VarList vars = new VarList();
            Var     V;
            int     gotType = Tok.TOK_BINARY;

            s.setValue(tok.getValue());
            s.setId(tok.getId());
            tok.scan();

            switch (tok.getId())
            {
            case Tok.TOK_1_EQUALS:
                if (curtree.FindByName(s.getValue()) == null)
                {
                    io.Abort("PL0137: undeclared variable");
                }
                V = new Var(); V.setName(s.getValue()); vars.add(V);
                io.Message(s + "[Variable]");
                io.Message(tok + "[Equals]");
                tok.scan();
                gotType = bool_expr(0);
                typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId());
                null_stmt();
                break;

            case Tok.TOK_1_COMMA:
                io.Message(s + "[Variable]");
                if (curtree.FindByName(s.getValue()) == null)
                {
                    io.Abort("PL0137: undeclared variable");
                }
                V = new Var(); V.setName(s.getValue()); vars.add(V);
                while (tok.getId() != Tok.TOK_1_EQUALS)
                {
                    if (tok.getFirstChar() != ',')
                    {
                        io.Abort("PL0138: ',' or '=' expected");
                    }
                    io.Message(tok + "[Comma]");
                    tok.scan();

                    if (tok.getId() != Tok.TOK_IDENT)
                    {
                        io.Abort("PL0139: ident expected");
                    }
                    if (curtree.FindByName(tok.getValue()) == null)
                    {
                        io.Abort("PL0137: undeclared variable");
                    }
                    V = new Var(); V.setName(tok.getValue()); vars.add(V);
                    io.Message(tok + "[Variable]");
                    tok.scan();
                }
                io.Message(tok + "[Assign]");
                tok.scan();
                gotType = bool_expr(0);
                typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId());
                null_stmt();
                break;

            case Tok.TOK_1_REL:
                label(s);
                break;

            default:
                io.Abort("PL0140: not found expected token ':', ',' or '='");
                break;
            }

            for (int i = 0; i < vars.Length(); i++)
            {
                typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(i).getName()).getTypeId());
                emit.Store(curtree.FindByName(vars.FindByIndex(i).getName()));
                if (i < vars.Length() - 1)
                {
                    emit.Load(curtree.FindByName(vars.FindByIndex(0).getName()));
                }
            }
        }
コード例 #16
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();
        }
コード例 #17
0
        void do_stmt(VarList curtree)
        {
            bool needBranch = true;

            String label1 = new_label();             // loop start
            String label2 = new_label();             // loop end
            String label3 = new_label();
            String label4 = new_label();

            Var procvar = new Var();

            procvar.setName(curtree.genName());
            procvar.setType(Var.VAR_BLOCK);
            procvar.nodes = new VarList();

            for (int i = 0; i < curtree.Length(); i++)
            {
                if ((curtree.FindByIndex(i).type & (Var.VAR_LOCAL | Var.VAR_PARAM | Var.VAR_LABEL)) != 0)
                {
                    procvar.add(curtree.FindByIndex(i));
                }
            }

            io.Message(tok + "[DO]");
            tok.scan();
            switch (tok.getId())
            {
            case Tok.TOK_WHILE:
                io.Message(tok + "[WhileStatement]");
                emit.Label(label1);
                tok.scan();
                bool_expr(0);
                null_stmt();
                emit.Branch("brfalse", label2);
                break;

            case Tok.TOK_IDENT:                                                 // TODO
                assign_stmt(curtree);
                if (tok.getId() != Tok.TOK_TO)
                {
                    io.Abort("PL0123: TO expected");
                }
                tok.scan();
                bool_expr(0);
                null_stmt();
                break;

            case Tok.TOK_CASE:
                io.Message(tok + "[CaseStatement]");
                tok.scan();
                break;

            case Tok.TOK_1_SEMI:
                io.Message(tok + "[;]");
                needBranch = false;
                tok.scan();
                break;
            }

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

            if (needBranch)
            {
                emit.Branch("br", label1);
            }

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

            tok.scan();
            curtree.add(procvar);

            if (needBranch)
            {
                emit.Label(label2);
            }
        }
コード例 #18
0
ファイル: asm.cs プロジェクト: master/plil
        public void LocalVars(VarList v)
        {
            StringBuilder sb = new StringBuilder(Io.MAXSTR);
            sb.Append("\t.locals (");
            int max = v.Length();

            for (int i = 0; i < max; i++) {
                Var e = v.FindByIndex(i);
                String stype = "";
                switch (e.getTypeId()) {
                case Tok.TOK_FIXED:		stype = "int32"; break;
                case Tok.TOK_FLOAT:		stype = "float32"; break;
                case Tok.TOK_COMPLEX:	stype = "float64"; break;
                case Tok.TOK_REAL:		stype = "float32"; break;
                case Tok.TOK_BINARY:	stype = "int16"; break;
                case Tok.TOK_DECIMAL:	stype = "int32"; break;
                default:
                    io.Abort("PL0406: could not find type for local");
                    break;
                }
                sb.Append(stype);
                if (i < max-1) sb.Append(",");
            }

            sb.Append(")\r\n");
            io.Out(sb.ToString());
        }
コード例 #19
0
ファイル: blk.cs プロジェクト: master/plil
 public void mergeNodes(VarList p)
 {
     int i;
     for (i=0; i<p.Length(); i++) {
         Var varSrc = p.FindByIndex(i);
         Var varTrg = FindByName(varSrc.getName());
         if ((varTrg != null) && (varTrg.getType() != Var.VAR_PARAM))
             add(varSrc);
         else
         if (varTrg == null) {
             add(varSrc);
         } else {
             FindByName(varSrc.getName()).setTypeId(varSrc.getTypeId());
             FindByName(varSrc.getName()).setGranularity(varSrc.getGranularity());
         }
     }
 }