![]() |
libsesstype
2.0.0
Library for Session Types programming.
|
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__