libsesstype  2.0.0
Library for Session Types programming.
expr_print.h
00001 #ifndef SESSTYPE__PARAMETERISED__UTIL__EXPR_PRINT_H__
00002 #define SESSTYPE__PARAMETERISED__UTIL__EXPR_PRINT_H__
00003 
00004 #ifdef __cplusplus
00005 #include <iostream>
00006 #include <string>
00007 #endif
00008 
00009 #include "sesstype/parameterised/exprs.h"
00010 #include "sesstype/parameterised/util/expr_visitor.h"
00011 
00012 #ifdef __cplusplus
00013 namespace sesstype {
00014 namespace parameterised {
00015 namespace util {
00016 #endif
00017 
00018 #ifdef __cplusplus
00019 
00022 class ExprPrintVisitor : public ExprVisitor {
00023     std::ostream &os_;
00024 
00025   public:
00026     ExprPrintVisitor() : os_(std::cout) { }
00027 
00029     ExprPrintVisitor(std::ostream &os) : os_(os) { }
00030 
00031     virtual void visit(Expr *expr)
00032     {
00033         // Empty.
00034     }
00035 
00036     virtual void visit(BinExpr *expr)
00037     {
00038         // Empty.
00039     }
00040 
00041     virtual void visit(VarExpr *expr)
00042     {
00043         os_ << expr->name();
00044     }
00045 
00046     virtual void visit(ValExpr *expr)
00047     {
00048         os_ << expr->num();
00049     }
00050 
00051     virtual void visit(AddExpr *expr)
00052     {
00053         os_ << "(";
00054         expr->lhs()->accept(*this);
00055         os_ << "+";
00056         expr->rhs()->accept(*this);
00057         os_ << ")";
00058     }
00059 
00060     virtual void visit(SubExpr *expr)
00061     {
00062         os_ << "(";
00063         expr->lhs()->accept(*this);
00064         os_ << "-";
00065         expr->rhs()->accept(*this);
00066         os_ << ")";
00067     }
00068 
00069     virtual void visit(MulExpr *expr)
00070     {
00071         expr->lhs()->accept(*this);
00072         os_ << "*";
00073         expr->rhs()->accept(*this);
00074     }
00075 
00076     virtual void visit(DivExpr *expr)
00077     {
00078         expr->lhs()->accept(*this);
00079         os_ << "/";
00080         expr->rhs()->accept(*this);
00081     }
00082 
00083     virtual void visit(ModExpr *expr)
00084     {
00085         expr->lhs()->accept(*this);
00086         os_ << "%";
00087         expr->rhs()->accept(*this);
00088     }
00089 
00090     virtual void visit(ShlExpr *expr)
00091     {
00092         expr->lhs()->accept(*this);
00093         os_ << "<<";
00094         expr->rhs()->accept(*this);
00095     }
00096 
00097     virtual void visit(ShrExpr *expr)
00098     {
00099         expr->lhs()->accept(*this);
00100         os_ << ">>";
00101         expr->rhs()->accept(*this);
00102     }
00103 
00104     virtual void visit(SeqExpr *expr)
00105     {
00106         for (auto it=expr->seq_begin(); it!=expr->seq_end(); it++) {
00107             if (it != expr->seq_begin()) os_ << ",";
00108             os_ << *it;
00109         }
00110     }
00111 
00112     virtual void visit(RngExpr *expr)
00113     {
00114         os_ << expr->bindvar();
00115         expr->from()->accept(*this);
00116         os_ << "..";
00117         expr->to()->accept(*this);
00118     }
00119 
00120     virtual void visit(LogExpr *expr)
00121     {
00122         os_ << "log(";
00123         expr->value()->accept(*this);
00124         os_ << ",";
00125         expr->base()->accept(*this);
00126         os_ << ")";
00127     }
00128 };
00129 #endif // __cplusplus
00130 
00131 #ifdef __cplusplus
00132 } // namespace util
00133 #endif
00134 
00135 #ifdef __cplusplus
00136 extern "C" {
00137 #endif
00138 
00139 void st_expr_print(st_expr *expr);
00140 
00141 #ifdef __cplusplus
00142 } // extern "C"
00143 #endif
00144 
00145 #ifdef __cplusplus
00146 } // namespace parameterised
00147 } // namespace sesstype
00148 #endif
00149 
00150 #endif//SESSTYPE__PARAMETERISED__UTIL__EXPR_PRINT_H__
 All Classes Namespaces Files Functions