void Term(out Expression e)
        {
            Operator op; Expression e1, e2;

            Factor(out e1);
            e = e1;
            while (la.kind == 26 || la.kind == 27 || la.kind == 28)
            {
                MulOp(out op);
                Factor(out e2);
                e = new BinOp(op, e, e2);
            }
        }
        void SimExpr(out Expression e)
        {
            Expression e1, e2; Operator op;

            Term(out e1);
            e = e1;
            while (la.kind == 21 || la.kind == 22)
            {
                AddOp(out op);
                Term(out e2);
                e = new BinOp(op, e, e2);
            }
        }
        void BoolTerm(out Expression e)
        {
            Expression e1, e2; Operator op; e = null;

            SimBoolExpr(out e1);
            e = e1;
            while (la.kind == 14)
            {
                OrOp(out op);
                SimBoolExpr(out e2);
                e = new BinOp(op, e, e2);
            }
        }
        void SimBoolExpr(out Expression e)
        {
            Expression e1, e2; Operator op; e = null;

            SimExpr(out e1);
            e = e1;
            if (StartOf(2))
            {
                RelOp(out op);
                SimExpr(out e2);
                e = new BinOp(op, e, e2);
            }
        }
        void Expr(out Expression e)
        {
            Expression e1, e2; Operator op; e = null;

            BoolTerm(out e1);
            e = e1;
            while (la.kind == 13)
            {
                AndOp(out op);
                BoolTerm(out e2);
                e = new BinOp(op, e, e2);
            }
        }