Esempio n. 1
0
File: syn.cs Progetto: 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);
        }
Esempio n. 2
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);
            }
        }