public override void CaseASwitchCaseStm(ASwitchCaseStm node)
 {
     InASwitchCaseStm(node);
     if (node.GetBlock() != null)
     {
         node.GetBlock().Apply(this);
     }
     if (node.GetType() != null)
     {
         node.GetType().Apply(this);
     }
     OutASwitchCaseStm(node);
 }
示例#2
0
        //This should be done later, after type linking since we might make new variables for i++, which shouldn't clash with user definitions
        /*public override void OutAIncDecExp(AIncDecExp node)
        {
            //Replace with assignment
            //<exp>++ => <exp> + 1
            //(... foo = <exp> ...)++ => (... foo = <exp> ...) = (... foo ...) + 1
            //(... foo++ ...)++ => (... foo++ ...) = (... foo ...) + 1

            PLvalue clone = (PLvalue) node.GetLvalue().Clone();
            clone.Apply(new AssignFixup());
            PBinop binop;
            Token token;
            if (node.GetIncDecOp() is APostIncIncDecOp)
            {
                APostIncIncDecOp op = (APostIncIncDecOp) node.GetIncDecOp();
                token = op.GetToken();
                binop = new APlusBinop(new TPlus("+", op.GetToken().Line, op.GetToken().Pos));
            }
            else
            {
                APostDecIncDecOp op = (APostDecIncDecOp)node.GetIncDecOp();
                token = op.GetToken();
                binop = new AMinusBinop(new TMinus("-", op.GetToken().Line, op.GetToken().Pos));
            }
            ABinopExp addExp = new ABinopExp(new ALvalueExp(clone), binop, new AIntConstExp(new TIntegerLiteral("1", token.Line, token.Pos)));
            AAssignmentExp exp = new AAssignmentExp(new TAssign("=", token.Line, token.Pos), node.GetLvalue(), addExp);
            node.ReplaceBy(exp);
            exp.Apply(this);
        }

        private class AssignFixup : DepthFirstAdapter
        {
            public override void CaseAAssignmentExp(AAssignmentExp node)
            {
                ALvalueExp replacer = new ALvalueExp(node.GetLvalue());
                node.ReplaceBy(replacer);
            }
        }*/
        public override void CaseASwitchCaseStm(ASwitchCaseStm node)
        {
            AABlock block = (AABlock) node.GetBlock();
            Token token;
            if (node.GetType() is ACaseSwitchCaseType)
                token = ((ACaseSwitchCaseType) node.GetType()).GetToken();
            else
                token = ((ADefaultSwitchCaseType)node.GetType()).GetToken();
            block.SetToken(new TRBrace("{", token.Line, token.Pos));
            base.CaseASwitchCaseStm(node);
        }