ExprVisitor.h

Go to the documentation of this file.
00001 //===-- ExprVisitor.h -------------------------------------------*- C++ -*-===//
00002 //
00003 //                     The KLEE Symbolic Virtual Machine
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #ifndef KLEE_EXPRVISITOR_H
00011 #define KLEE_EXPRVISITOR_H
00012 
00013 #include "ExprHashMap.h"
00014 
00015 namespace klee {
00016   class ExprVisitor {
00017   protected:
00018     // typed variant, but non-virtual for efficiency
00019     class Action {
00020     public:
00021       enum Kind { SkipChildren, DoChildren, ChangeTo };
00022 
00023     private:
00024       //      Action() {}
00025       Action(Kind _kind) 
00026         : kind(_kind), argument(ConstantExpr::alloc(0, Expr::Bool)) {}
00027       Action(Kind _kind, const ref<Expr> &_argument) 
00028         : kind(_kind), argument(_argument) {}
00029 
00030       friend class ExprVisitor;
00031 
00032     public:
00033       Kind kind;
00034       ref<Expr> argument;
00035 
00036       static Action changeTo(const ref<Expr> &expr) { 
00037         return Action(ChangeTo,expr); 
00038       }
00039       static Action doChildren() { return Action(DoChildren); }
00040       static Action skipChildren() { return Action(SkipChildren); }
00041     };
00042 
00043   protected:
00044     explicit
00045     ExprVisitor(bool _recursive=false) : recursive(_recursive) {}
00046     virtual ~ExprVisitor() {}
00047 
00048     virtual Action visitExpr(const Expr&);
00049     virtual Action visitExprPost(const Expr&);
00050 
00051     virtual Action visitNotOptimized(const NotOptimizedExpr&);
00052     virtual Action visitRead(const ReadExpr&);
00053     virtual Action visitSelect(const SelectExpr&);
00054     virtual Action visitConcat(const ConcatExpr&);
00055     virtual Action visitExtract(const ExtractExpr&);
00056     virtual Action visitZExt(const ZExtExpr&);
00057     virtual Action visitSExt(const SExtExpr&);
00058     virtual Action visitAdd(const AddExpr&);
00059     virtual Action visitSub(const SubExpr&);
00060     virtual Action visitMul(const MulExpr&);
00061     virtual Action visitUDiv(const UDivExpr&);
00062     virtual Action visitSDiv(const SDivExpr&);
00063     virtual Action visitURem(const URemExpr&);
00064     virtual Action visitSRem(const SRemExpr&);
00065     virtual Action visitAnd(const AndExpr&);
00066     virtual Action visitOr(const OrExpr&);
00067     virtual Action visitXor(const XorExpr&);
00068     virtual Action visitShl(const ShlExpr&);
00069     virtual Action visitLShr(const LShrExpr&);
00070     virtual Action visitAShr(const AShrExpr&);
00071     virtual Action visitEq(const EqExpr&);
00072     virtual Action visitNe(const NeExpr&);
00073     virtual Action visitUlt(const UltExpr&);
00074     virtual Action visitUle(const UleExpr&);
00075     virtual Action visitUgt(const UgtExpr&);
00076     virtual Action visitUge(const UgeExpr&);
00077     virtual Action visitSlt(const SltExpr&);
00078     virtual Action visitSle(const SleExpr&);
00079     virtual Action visitSgt(const SgtExpr&);
00080     virtual Action visitSge(const SgeExpr&);
00081 
00082   private:
00083     typedef ExprHashMap< ref<Expr> > visited_ty;
00084     visited_ty visited;
00085     bool recursive;
00086 
00087     ref<Expr> visitActual(const ref<Expr> &e);
00088     
00089   public:
00090     // apply the visitor to the expression and return a possibly
00091     // modified new expression.
00092     ref<Expr> visit(const ref<Expr> &e);
00093   };
00094 
00095 }
00096 
00097 #endif

Generated on Fri Jun 5 03:31:31 2009 for klee by  doxygen 1.5.8