コード例 #1
0
ファイル: var.cs プロジェクト: master/plil
 public void addNodes(VarList p)
 {
     int i;
     for (i=0;i<p.Length();i++) {
         nodes.add(p.FindByIndex(i));
     }
 }
コード例 #2
0
ファイル: syn.cs プロジェクト: master/plil
        public void parse_and_compile()
        {
            prolog();

            tree = new VarList();

            IDictionaryEnumerator libEnum = lib.get_enum();

            while ( libEnum.MoveNext() ) {
                Var procvar = new Var();
                LibFunc lfunc = (LibFunc)libEnum.Value;

                procvar.setName(lfunc.nameShort);
                procvar.setType(Var.VAR_BLOCK);
                procvar.setTypeId(Tok.TOK_VOID);
                procvar.nodes = new VarList();

                for (int i = 0; i < lfunc.typeParams.Count; i++ ) {
                    Var param = new Var();
                    param.setName("PAR_"+i);
                    param.setType(Var.VAR_PARAM);
                    param.setTypeId((int)lfunc.typeParams[i]);
                    procvar.nodes.add(param);
                }

                tree.add(procvar);
            }

            io.ReadChar();
            tok.scan();
            declarations(tree);
            while (tok.NotEOF())
            {
                stmt(tree, null, null);
            }
            io.Message("compiled successfuly");
            io.TreeDraw(tree);
            epilog();
        }
コード例 #3
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()));
            }
        }
コード例 #4
0
ファイル: syn.cs プロジェクト: master/plil
 void simple_var(VarList curtree)
 {
     Var var = new Var();
     var.setName(tok.getValue());
     var.setClassId(Tok.T_DEFCLASS);
     try
     {
         curtree.add(var);
     }
     catch
     {
         io.Abort("PL0107: invalid variable declaration");
     }
     io.Message(tok+"[Var]");
     tok.scan();
 }
コード例 #5
0
ファイル: syn.cs プロジェクト: 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();
        }
コード例 #6
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());
         }
     }
 }
コード例 #7
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());
        }
コード例 #8
0
ファイル: var.cs プロジェクト: master/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;
 }
コード例 #9
0
ファイル: syn.cs プロジェクト: master/plil
        void goto_stmt(VarList curtree)
        {
            String label1;

            if (tok.getId() == Tok.TOK_GO) {
                io.Message(tok+"[GO]");
                tok.scan();
                if (tok.getId() != Tok.TOK_TO) io.Abort("PL0125: TO expected");
            }

            io.Message(tok+"[GOTO]");
            tok.scan();
            switch (tok.getId())
            {
                case Tok.TOK_IDENT:
                    label1 = "L@@"+tok.getValue();
                    if ((curtree.FindByName(label1) != null) &&
                        (curtree.FindByName(label1).getType() == Var.VAR_LABEL)) {
                        emit.Branch("br", label1);
                        io.Message(tok+"[Label]");
                    } else {
                        io.Abort("PL0126: undefined label");
                    }
                    break;
                case Tok.TOK_DIGITS:
                    io.Message(tok+"[Source Line]");
                    break;
                default: io.Abort("PL0127: GOTO without direction");
                    break;
            }
            tok.scan();
        }
コード例 #10
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);
        }
コード例 #11
0
ファイル: syn.cs プロジェクト: master/plil
        void decl_stmt(VarList curtree)
        {
            VarList vars = new VarList();

            io.Message(tok+"[DECLARE]");
            tok.scan();

            switch (tok.getId())
            {
                case Tok.TOK_1_LBRACKET:
                    param(vars);
                    break;
                case Tok.TOK_IDENT:
                    simple_var(vars);
                    break;
                case Tok.TOK_DIGITS:
                    break;
            }

            if (tok.getId() == Tok.TOK_1_LBRACKET)
            {
                io.Message(tok+"[(]");
                tok.scan();
                if (tok.getId() != Tok.TOK_DIGITS) io.Abort("PL0113: constant expected");
                io.Message(tok+"[Constant]");

                vars.setNodesGranularity(System.Convert.ToInt32(tok.getValue()));

                tok.scan();
                if (tok.getId() != Tok.TOK_1_RBRACKET) io.Abort("PL0114: ')' 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:
                    vars.setNodesType(Var.VAR_LOCAL);
                    vars.setNodesTypeId(tok.getId());
                    try
                    {
                        curtree.mergeNodes(vars);
                    }
                    catch
                    {
                        io.Abort("PL0107: invalid variable declaration");
                    }
                    io.Message(tok+"[Type]");
                    tok.scan();
                break;
                default:
                    io.Abort("PL0115: type specifier expected");
                    break;
            }
        }
コード例 #12
0
ファイル: syn.cs プロジェクト: master/plil
 void declarations(VarList curtree)
 {
     while ((tok.getId() == Tok.TOK_DCL) ||
         (tok.getId() == Tok.TOK_DECLARE)) {
             decl_stmt(curtree);
             null_stmt();
     }
 }
コード例 #13
0
ファイル: syn.cs プロジェクト: master/plil
        void call_stmt(VarList curtree)
        {
            io.Message(tok+"[CALL]");
            tok.scan();

            if (tok.getId() != Tok.TOK_IDENT) io.Abort("PL0131: ident after CALL expected");
            io.Message(tok+"[Ident]");

            Var e = call_construct(tok.getValue());

            emit.Call(e);
            if (e.getTypeId() != Tok.TOK_VOID)	emit.Insn("pop");

            tok.scan();
        }
コード例 #14
0
ファイル: syn.cs プロジェクト: master/plil
 void var_list(VarList curtree)
 {
     Var var1 = new Var();
     var1.setName(tok.getValue());
     try
     {
         curtree.add(var1);
     }
     catch
     {
         io.Abort("PL0107: invalid variable declaration");
     }
     io.Message(tok+"[Var]");
     tok.scan();
     while ((tok.getId() == Tok.TOK_1_COMMA) || (tok.getId() == Tok.TOK_IDENT)) {
         if (tok.getFirstChar() != ',') io.Abort("PL0108: ',' or ')' expected");
         io.Message(tok+"[Comma]");
         tok.scan();
         if (tok.getId() != Tok.TOK_IDENT) io.Abort("PL0109: ident expected");
         var1 = new Var();
         var1.setName(tok.getValue());
         try
         {
             curtree.add(var1);
         }
         catch
         {
             io.Abort("PL0107: invalid variable declaration");
         }
        				io.Message(tok+"[Var]");
         tok.scan();
     }
 }
コード例 #15
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;
        }
コード例 #16
0
ファイル: syn.cs プロジェクト: master/plil
        void stmt(VarList curtree, String ilabel, String olabel)
        {
            Var e = new Var();
            currenttree = curtree;

            if (io.EOF())
                io.Abort("PL0142: expected statement but end of file encountered");

            if ((tok.getId() != Tok.TOK_PROC) && (tok.getId() != Tok.TOK_PROCEDURE))
                if (last_label != null) {
                    emit.Label("L@@"+last_label);
                    last_label = null;
                }

            switch (tok.getId()) {
                case Tok.TOK_RETURN:
             				ret_stmt(ilabel, olabel);
                    null_stmt();
                    break;
                case Tok.TOK_IDENT:
                    ident_stmt(curtree);
                    break;
                case Tok.TOK_CALL:
                    call_stmt(curtree);
                    null_stmt();
                    break;
                case Tok.TOK_DO:
                    do_stmt(curtree);
                    null_stmt();
                    break;
                case Tok.TOK_GO:
                case Tok.TOK_GOTO:
                    goto_stmt(curtree);
                    null_stmt();
                    break;
                case Tok.TOK_PROCEDURE:
                case Tok.TOK_PROC:
                    proc_decl(curtree, last_label);
                    null_stmt();
                    break;
                case Tok.TOK_IF:
                    if_stmt(curtree, ilabel, olabel);
                    break;
                case Tok.TOK_DCL:
                case Tok.TOK_DECLARE:
                    io.Abort("PL0143: wild declaration found");
                    break;
                case Tok.TOK_UNKNOWN:
                    io.Abort("PL0144: unknown construction");
                    break;
                case Tok.TOK_END:
                case Tok.TOK_ELSE:
                case Tok.TOK_THEN:
                    break;
                default:
                    io.Abort("PL0145: wild symbol found");
                    break;
                }
        }
コード例 #17
0
ファイル: emt.cs プロジェクト: master/plil
 public void LocalVars(VarList v)
 {
     NextInsn(0);
     localvars = v;
     icur.setIType(IAsm.I_LOCALDEF);
 }
コード例 #18
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()));
            }
        }
コード例 #19
0
ファイル: var.cs プロジェクト: master/plil
 public void setNodes(VarList p)
 {
     nodes = p;
 }
コード例 #20
0
ファイル: syn.cs プロジェクト: master/plil
        void if_stmt(VarList curtree, String olabel, String ilabel)
        {
            String label1;
            String label2;

            io.Message(tok+"[IF]");
              			tok.scan();

              			bool_expr(0);

            label1 = new_label();
            label2 = String.Copy(label1);

            emit.Branch("brfalse", label1);

            if (tok.getId() != Tok.TOK_THEN) io.Abort("PL0130: THEN expected");
            io.Message(tok+"[THEN]");
            tok.scan();

            stmt(curtree, olabel, ilabel);

            if (tok.getId() == Tok.TOK_ELSE) {
                io.Message(tok+"[ELSE]");
                label2 = new_label();
                emit.Branch("br", label2);

                emit.Label(label1);

                tok.scan();
                stmt(curtree, olabel, ilabel);
            }
            emit.Label(label2);
        }
コード例 #21
0
ファイル: ios.cs プロジェクト: master/plil
 public override void TreeDraw(VarList tree)
 {
 }
コード例 #22
0
ファイル: syn.cs プロジェクト: master/plil
 void param(VarList curtree)
 {
     io.Message(tok+"[(]");
     tok.scan();
     var_list(curtree);
     if (tok.getId() != Tok.TOK_1_RBRACKET) io.Abort("PL0110: ')' expected");
     io.Message(tok+"[)]");
     tok.scan();
 }
コード例 #23
0
ファイル: ios.cs プロジェクト: master/plil
 public virtual void TreeDraw(VarList tree)
 {
 }
コード例 #24
0
ファイル: var.cs プロジェクト: stjordanis/plil
 public void setNodes(VarList p)
 {
     nodes = p;
 }