Ejemplo n.º 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()));
                }
            }
        }
Ejemplo n.º 2
0
        int ident()
        {
            int Typecast = Tok.TOK_VOID;

            if (io.getNextChar() == '(')
            {
                io.Message(tok + "[Ident]");

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

                if (Typecast == Tok.TOK_VOID)
                {
                    io.Abort("PL0147: using void function where expecting a value");
                }

                emit.Call(e);
                tok.scan();
            }
            else
            {
                if (currenttree.FindByName(tok.getValue()) == null)
                {
                    io.Abort("PL0105: undeclared variable");
                }

                Typecast = currenttree.FindByName(tok.getValue()).getTypeId();
                emit.Load(currenttree.FindByName(tok.getValue()));

                io.Message(tok + "[Ident]");
                tok.scan();
            }
            return(Typecast);
        }
Ejemplo n.º 3
0
        Var call_construct(string s)
        {
            Var procvar = new Var();
            Var e;
            int i       = 0;
            int parType = Tok.TOK_BINARY;

            e = tree.FindByName(s);

            if (e == null)
            {
                io.Abort("PL0132: invalid procedure call: undefined procedure");
            }
            if (e.getType() != Var.VAR_BLOCK)
            {
                io.Abort("PL0133: invalid procedure call: not a procedure");
            }

            tok.scan();
            if (tok.getId() != Tok.TOK_1_LBRACKET)
            {
                io.Abort("PL0134: '(' expected");
            }
            tok.scan();
            if (tok.getId() != Tok.TOK_1_RBRACKET)
            {
                parType = bool_expr(0);
                typeCheckAssign(parType, e.getParams().FindByIndex(i).getTypeId());
                i++;
                while (tok.getId() == Tok.TOK_1_COMMA)
                {
                    tok.scan();
                    parType = bool_expr(0);
                    typeCheckAssign(parType, e.getParams().FindByIndex(i).getTypeId());
                    i++;
                }
                if (tok.getId() != Tok.TOK_1_RBRACKET)
                {
                    io.Abort("PL0135: ')' expected");
                }
            }

            if (i != e.getParams().Length())
            {
                io.Abort("PL0136: invalid procedure call: wrong number of parametrs");
            }

            return(e);
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
Archivo: syn.cs Proyecto: 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()));
            }
        }
Ejemplo n.º 6
0
Archivo: syn.cs Proyecto: 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()));
            }
        }
Ejemplo n.º 7
0
Archivo: syn.cs Proyecto: 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();
        }
Ejemplo n.º 8
0
        public void Store(IAsm a)
        {
            if (a.getVar() == null)
            {
                io.ICE("store instruction with no variable ptr");
            }
            Var e = localvars.FindByName(a.getVar().getName());

            if (e == null)
            {
                e = a.getVar();
            }
            int id = e.getClassId();

            if (e.getLocalToken() != null)
            {
                LocalBuilder lt = (LocalBuilder)e.getLocalToken();
                il.Emit(OpCodes.Stloc, lt);
            }
            else
            {
                if (e.getFieldBuilder() != null)
                {
                    FieldBuilder fb = (FieldBuilder)e.getFieldBuilder();
                    if (id == Tok.T_STATIC)
                    {
                        il.Emit(OpCodes.Stsfld, fb);
                    }
                    else
                    {
                        il.Emit(OpCodes.Stfld, fb);
                    }
                }
                else
                {
                    int index = e.getIndex();
                    if (id == Tok.T_PARAM)
                    {
                        if (index <= 256)
                        {
                            il.Emit(OpCodes.Starg_S, index);
                        }
                        else
                        {
                            il.Emit(OpCodes.Starg, index);
                        }
                    }
                    else
                    {
                        if (id == Tok.T_AUTO || id == Tok.T_DEFCLASS)
                        {
                            il.Emit(OpCodes.Stloc, index);
                        }
                        else
                        {
                            io.ICE("instruction load of unknown class (" + e.getClassId() + ")");
                        }
                    }
                }
            }
        }
Ejemplo n.º 9
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()));
                }
            }
        }