Esempio n. 1
0
    void Statement(out Operand st)
    {
        Operand op1 = null, op2 = null, op3 = null; Operand st1 = null, st2 = null; st = null;

        if (la.kind == 7)
        {
            Get();
            Block(out op1);
            Expect(59);
        }
        else if (la.kind == 20)
        {
            Get();
            Expression(out op1);
            env.codeGen.While(op1);
            Expect(7);
            Block(out st1);
            Expect(59);
        }
        else if (la.kind == 18)
        {
            Get();
            env.codeGen.Do();
            Block(out st1);
            Expect(60);
            Expression(out op1);
            env.codeGen.WhileNeg(op1);
        }
        else if (la.kind == 13)
        {
            Get();
            Expression(out op1);
            Expect(61);
            env.codeGen.If(op1);
            Block(out st1);
            while (la.kind == 9)
            {
                Get();
                Expression(out op2);
                env.codeGen.Else(); env.codeGen.If(op2);
                Expect(61);
                Block(out st2);
            }
            if (la.kind == 8)
            {
                Get();
                env.codeGen.Else();
                Block(out st2);
            }
            Expect(59);
        }
        else if (la.kind == 11)
        {
            Get();
            NameList(out op1);
            if (la.kind == 23)
            {
                Get();
                Expression(out op2);
                Expect(25);
                Expression(out op3);
                if (la.kind == 25)
                {
                    Get();
                    Expression(out st1);
                }
                env.codeGen.For(op1, op2, op3, st1);
                Expect(7);
                Block(out st2);
                Expect(59);
            }
            else if (la.kind == 14)
            {
                Get();
                ExprList(out op2);
                env.codeGen.ForEach(op1, op2);
                Expect(7);
                Block(out st1);
                Expect(59);
            }
            else
            {
                SynErr(75);
            }
        }
        else if (la.kind == 12)
        {
            Get();
            FuncName(out op1);
            FuncBody(op1);
        }
        else if (la.kind == 15)
        {
            Get();
            if (la.kind == 12)
            {
                Get();
                Name(out op1);
                FuncBody(op1);
            }
            else if (la.kind == 1)
            {
                NameList(out op1);
                if (la.kind == 23)
                {
                    Get();
                    if (StartOf(3))
                    {
                        ExprList(out op2);
                        if (env.codeGen.IsScoped)
                        {
                            env.codeGen.Emit(ListOfOperands.ToOperand(op1, op2, true)); env.codeGen.End();
                        }
                        else
                        {
                            env.AddFieldWithInitializer(op1, op2);
                        }
                    }
                    else if (la.kind == 62)
                    {
                        Get();
                        if (la.kind == 36)
                        {
                            Get();
                        }
                        if (la.kind == 4)
                        {
                            Get();
                        }
                        else if (la.kind == 5)
                        {
                            Get();
                        }
                        else
                        {
                            SynErr(76);
                        }
                        env.AddDependency(op1.ToString(), t.val);
                        if (la.kind == 52)
                        {
                            Get();
                        }
                        env.AddField(op1.ToString());
                    }
                    else
                    {
                        SynErr(77);
                    }
                }
            }
            else
            {
                SynErr(78);
            }
        }
        else if (la.kind == 62)
        {
            Get();
            if (la.kind == 4)
            {
                Get();
            }
            else if (la.kind == 5)
            {
                Get();
            }
            else
            {
                SynErr(79);
            }
            env.AddDependency(t.val);
        }
        else if (StartOf(3))
        {
            ExprList(out op1);
            env.codeGen.Emit(op1);
            env.codeGen.End();
        }
        else
        {
            SynErr(80);
        }
    }