@Override
 public void caseALoopStmt(ALoopStmt node) {
   inALoopStmt(node);
   if (node.getN2() != null) {
     node.getN2().apply(this);
   }
   if (node.getL2() != null) {
     node.getL2().apply(this);
   }
   if (node.getEnd() != null) {
     node.getEnd().apply(this);
   }
   {
     List<PStmt> copy = new ArrayList<PStmt>(node.getStmt());
     Collections.reverse(copy);
     for (PStmt e : copy) {
       e.apply(this);
     }
   }
   if (node.getN1() != null) {
     node.getN1().apply(this);
   }
   if (node.getExpr() != null) {
     node.getExpr().apply(this);
   }
   if (node.getWhile() != null) {
     node.getWhile().apply(this);
   }
   if (node.getL1() != null) {
     node.getL1().apply(this);
   }
   outALoopStmt(node);
 }
 @Override
 public void caseAMethodDecl(AMethodDecl node) {
   inAMethodDecl(node);
   if (node.getN3() != null) {
     node.getN3().apply(this);
   }
   if (node.getEndid() != null) {
     node.getEndid().apply(this);
   }
   if (node.getEnd() != null) {
     node.getEnd().apply(this);
   }
   {
     List<PStmt> copy = new ArrayList<PStmt>(node.getStmt());
     Collections.reverse(copy);
     for (PStmt e : copy) {
       e.apply(this);
     }
   }
   if (node.getN2() != null) {
     node.getN2().apply(this);
   }
   if (node.getBegin() != null) {
     node.getBegin().apply(this);
   }
   {
     List<PVarDecl> copy = new ArrayList<PVarDecl>(node.getVarDecl());
     Collections.reverse(copy);
     for (PVarDecl e : copy) {
       e.apply(this);
     }
   }
   if (node.getN1() != null) {
     node.getN1().apply(this);
   }
   if (node.getIs() != null) {
     node.getIs().apply(this);
   }
   if (node.getOptType() != null) {
     node.getOptType().apply(this);
   }
   if (node.getRPar() != null) {
     node.getRPar().apply(this);
   }
   if (node.getArgumentDeclList() != null) {
     node.getArgumentDeclList().apply(this);
   }
   if (node.getLPar() != null) {
     node.getLPar().apply(this);
   }
   if (node.getStid() != null) {
     node.getStid().apply(this);
   }
   outAMethodDecl(node);
 }
 @Override
 public void caseABlockStmt(ABlockStmt node) {
   inABlockStmt(node);
   if (node.getLbrace() != null) {
     node.getLbrace().apply(this);
   }
   {
     List<PStmt> copy = new ArrayList<PStmt>(node.getStmt());
     for (PStmt e : copy) {
       e.apply(this);
     }
   }
   if (node.getRbrace() != null) {
     node.getRbrace().apply(this);
   }
   outABlockStmt(node);
 }
 @Override
 public void caseAOptElse(AOptElse node) {
   inAOptElse(node);
   {
     List<PStmt> copy = new ArrayList<PStmt>(node.getStmt());
     Collections.reverse(copy);
     for (PStmt e : copy) {
       e.apply(this);
     }
   }
   if (node.getNewlines() != null) {
     node.getNewlines().apply(this);
   }
   if (node.getElse() != null) {
     node.getElse().apply(this);
   }
   outAOptElse(node);
 }
 @Override
 public void caseAMethodMaindecl(AMethodMaindecl node) {
   inAMethodMaindecl(node);
   if (node.getPrivacy() != null) {
     node.getPrivacy().apply(this);
   }
   if (node.getStatic() != null) {
     node.getStatic().apply(this);
   }
   if (node.getType() != null) {
     node.getType().apply(this);
   }
   if (node.getId() != null) {
     node.getId().apply(this);
   }
   if (node.getLparen() != null) {
     node.getLparen().apply(this);
   }
   if (node.getParamlist() != null) {
     node.getParamlist().apply(this);
   }
   if (node.getRparen() != null) {
     node.getRparen().apply(this);
   }
   if (node.getLbrace() != null) {
     node.getLbrace().apply(this);
   }
   {
     List<PStmt> copy = new ArrayList<PStmt>(node.getStmt());
     for (PStmt e : copy) {
       e.apply(this);
     }
   }
   if (node.getRbrace() != null) {
     node.getRbrace().apply(this);
   }
   outAMethodMaindecl(node);
 }
 @Override
 public void caseAIfStmt(AIfStmt node) {
   inAIfStmt(node);
   if (node.getN2() != null) {
     node.getN2().apply(this);
   }
   if (node.getI2() != null) {
     node.getI2().apply(this);
   }
   if (node.getEnd() != null) {
     node.getEnd().apply(this);
   }
   if (node.getOptElse() != null) {
     node.getOptElse().apply(this);
   }
   {
     List<PStmt> copy = new ArrayList<PStmt>(node.getStmt());
     Collections.reverse(copy);
     for (PStmt e : copy) {
       e.apply(this);
     }
   }
   if (node.getN1() != null) {
     node.getN1().apply(this);
   }
   if (node.getThen() != null) {
     node.getThen().apply(this);
   }
   if (node.getExpr() != null) {
     node.getExpr().apply(this);
   }
   if (node.getI1() != null) {
     node.getI1().apply(this);
   }
   outAIfStmt(node);
 }