libsesstype  2.0.0
Library for Session Types programming.
print.h
00001 #ifndef SESSTYPE__PARAMETERISED__UTIL__PRINT_H__
00002 #define SESSTYPE__PARAMETERISED__UTIL__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/nodes.h"
00011 
00012 #include "sesstype/parameterised/role.h"
00013 #include "sesstype/parameterised/role_grp.h"
00014 
00015 #include "sesstype/parameterised/util/node_visitor.h"
00016 #include "sesstype/parameterised/util/role_visitor.h"
00017 #include "sesstype/parameterised/util/expr_visitor.h"
00018 
00019 #ifdef __cplusplus
00020 namespace sesstype {
00021 namespace parameterised {
00022 namespace util {
00023 #endif
00024 
00025 #ifdef __cplusplus
00026 
00029 class PrintVisitor : public NodeVisitor, public RoleVisitor, public ExprVisitor {
00030     std::ostream &os_;
00031     std::string indent_str_;
00032     unsigned int indent_lvl_;
00033     unsigned int line_count_;
00034 
00035   public:
00037     PrintVisitor() : os_(std::cout),
00038               indent_str_("  "),
00039               indent_lvl_(0),
00040               line_count_(1) { }
00041 
00044     PrintVisitor(std::ostream &os) : os_(os),
00045                               indent_str_("  "),
00046                               indent_lvl_(0),
00047                               line_count_(1) { }
00048 
00050     void prefix()
00051     {
00052         if (line_count_ == 1) {
00053             os_ << "Line\t |\tTree\n====================\n";
00054         }
00055         os_ << line_count_++ << "\t ";
00056         if (indent_lvl_ > 0) {
00057             os_ << '|';
00058             for (unsigned int i=0; i<indent_lvl_; i++) {
00059                 os_ << indent_str_;
00060             }
00061         }
00062     }
00063 
00064     void reset_line_num()
00065     {
00066         indent_lvl_ = 0;
00067         line_count_ = 1;
00068     }
00069 
00070     void addr(Node *node)
00071     {
00072         os_ << " \033[2;33m" << node << "\033[0m";
00073     }
00074 
00075     void addr(Role *role)
00076     {
00077         os_ << "@\033[2;36m" << role << "\033[0m";
00078     }
00079 
00080     void addr(Expr *expr)
00081     {
00082         os_ << " @ \033[2;35m" << expr << "\033[0m";
00083     }
00084 
00085     virtual void visit(Node *node)
00086     {
00087         prefix();
00088         os_ << "generic {}";
00089         addr(node);
00090         os_ << "\n";
00091     }
00092 
00093     virtual void visit(InteractionNode *node)
00094     {
00095         prefix();
00096         os_ << "interaction";
00097         addr(node);
00098         os_ << " { from: ";
00099         if (node->sndr()) {
00100             node->sndr()->accept(*this);
00101         } else {
00102             os_ << "(empty)";
00103         }
00104         os_ << ", to(" << node->num_rcvrs() << "): [";
00105         if (node->num_rcvrs() > 0) {
00106             node->rcvr()->accept(*this);
00107         } else {
00108             os_ << "(empty)";
00109         }
00110         os_ << (node->num_rcvrs()>1 ? ".. ]" : "]")
00111             << ", msg: " << node->msg()->label()
00112             << "(" << node->msg()->num_payloads() << ") "
00113             << ", cond: ";
00114         if (node->cond()) {
00115             node->cond()->accept(*this);
00116         } else {
00117             os_ << "(none)";
00118         }
00119         os_ << " }\n";
00120     }
00121 
00122     virtual void visit(BlockNode *node)
00123     {
00124         if (node->num_children() > 0) {
00125             prefix();
00126             os_ << "root";
00127             addr(node);
00128             os_ <<" {\n";
00129             indent_lvl_++;
00130             for (auto it=node->child_begin(); it!=node->child_end(); it++) {
00131                 (*it)->accept(*this);
00132             }
00133             indent_lvl_--;
00134             prefix();
00135             os_ << "}\n";
00136         }
00137     }
00138 
00139     virtual void visit(RecurNode *node)
00140     {
00141         prefix();
00142         os_ << "recur";
00143         addr(node);
00144         os_ <<" { label: " << node->label() << " }";
00145         os_ << " children: " << node->num_children() << "\n";
00146 
00147         node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this);
00148     }
00149 
00150     virtual void visit(ContinueNode *node)
00151     {
00152         prefix();
00153         os_ << "cont";
00154         addr(node);
00155         os_ << " { label: " << node->label() << " }\n";
00156     }
00157 
00158     virtual void visit(ChoiceNode *node)
00159     {
00160         prefix();
00161         os_ << "choice";
00162         addr(node);
00163         os_ << " { at: ";
00164         node->at()->accept(*this);
00165         os_ << ", children: " << node->num_children() << "\n";
00166 
00167         node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this);
00168     }
00169 
00170     virtual void visit(ParNode *node)
00171     {
00172         prefix();
00173         os_ << "par";
00174         addr(node);
00175         os_ << " {}";
00176         os_ << " parblocks:children: " << node->num_children() << "\n";
00177 
00178         node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this);
00179     }
00180 
00181     virtual void visit(NestedNode *node)
00182     {
00183         prefix();
00184         os_ << "nested";
00185         addr(node);
00186         os_ << " { name: " << node->name();
00187         os_ << ", scope: " << node->scope();
00188         os_ << ", arg("<< node->num_args() <<"): <";
00189         for (auto it=node->arg_begin(); it!=node->arg_end(); it++) {
00190             if (it!=node->arg_begin()) {
00191                 os_ << ", ";
00192             }
00193             os_ << (*it)->label() << "(" << (*it)->num_payloads() << ")";
00194         }
00195         os_ << ">";
00196         os_ << ", rolearg("<< node->num_roleargs() <<"): [";
00197         for (auto it=node->rolearg_begin(); it!=node->rolearg_end(); it++) {
00198             if (it != node->rolearg_begin()) {
00199                 os_ << ", ";
00200             }
00201             (*it)->accept(*this);
00202         }
00203         os_ << "]}\n";
00204     }
00205 
00206     virtual void visit(InterruptibleNode *node)
00207     {
00208         prefix();
00209         os_ << "interruptible";
00210         addr(node);
00211         os_ << " { scope: " << node->scope();
00212         os_ << " interrupts(" << node->num_interrupts() << "): ";
00213         for (auto it=node->interrupt_begin(); it!=node->interrupt_end(); it++) {
00214             os_ << (*it).first->name() << "/" << (*it).second->label() << ", ";
00215         }
00216         os_ << ", catches(" << node->num_catches() << "): ";
00217         for (auto it=node->catch_begin(); it!=node->catch_end(); it++) {
00218             os_ << (*it).first->name() << "/" << (*it).second->label() << ", ";
00219         }
00220         os_ << ", throws(" << node->num_throws() << "): ";
00221         for (auto it=node->throw_begin(); it!=node->throw_end(); it++) {
00222             os_ << (*it).first->name() << "/" << (*it).second->label() << ", ";
00223         }
00224         os_ <<"}\n";
00225     }
00226 
00227     virtual void visit(ForNode *node)
00228     {
00229         prefix();
00230         os_ << "for";
00231         addr(node);
00232         os_ << " { expr: ";
00233         node->bindexpr()->accept(*this);
00234         os_ << " }\n";
00235 
00236         node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this);
00237     }
00238 
00239     virtual void visit(OneofNode *node)
00240     {
00241         prefix();
00242         os_ << "oneof";
00243         addr(node);
00244         os_ << " { range: ";
00245         node->range()->accept(*this);
00246         os_ << " , repeat? " << node->is_repeat();
00247         os_ << " , unordered? " << node->is_unordered();
00248         os_ << " }\n";
00249 
00250         node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this);
00251     }
00252 
00253     virtual void visit(IfNode *node)
00254     {
00255         prefix();
00256         os_ << "if";
00257         addr(node);
00258         os_ << " { cond: ";
00259         node->cond()->accept(*this);
00260         os_ << " }\n";
00261 
00262         node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this);
00263     }
00264 
00265     virtual void visit(AllReduceNode *node)
00266     {
00267         prefix();
00268         os_ << "allreduce";
00269         addr(node);
00270         os_ << " { msg: " << node->msg()->label();
00271         os_  << "(" << node->msg()->num_payloads() << ") }\n";
00272     }
00273 
00274     virtual void visit(Role *role)
00275     {
00276         os_ << role->name();
00277         for (int i=0; i<role->num_dimens(); i++) {
00278             os_ << "[";
00279             (*role)[i]->accept(*this);
00280             os_ << "]";
00281         }
00282         addr(role);
00283     }
00284 
00285     virtual void visit(RoleGrp *role)
00286     {
00287         os_ << role->name();
00288         os_ << "{ members#: " << role->num_members() << ", membs: ";
00289         for (auto it=role->member_begin(); it!=role->member_end(); it++) {
00290             (*it)->accept(*this);
00291             os_ << " ";
00292         }
00293         os_ << " }";
00294         addr(role);
00295     }
00296 
00297     virtual void visit(Expr *expr)
00298     {
00299         // Empty.
00300     }
00301 
00302     virtual void visit(VarExpr *expr)
00303     {
00304         os_ << "var(" << expr->name() << ")";
00305         addr(expr);
00306     }
00307 
00308     virtual void visit(ValExpr *expr)
00309     {
00310         os_ << "val(" << expr->num() << ")";
00311         addr(expr);
00312     }
00313 
00314     virtual void visit(AddExpr *expr)
00315     {
00316         os_ << "+(";
00317         expr->lhs()->accept(*this);
00318         os_ << " , ";
00319         expr->rhs()->accept(*this);
00320         os_ << ")";
00321         addr(expr);
00322     }
00323 
00324     virtual void visit(SubExpr *expr)
00325     {
00326         os_ << "-(";
00327         expr->lhs()->accept(*this);
00328         os_ << " , ";
00329         expr->rhs()->accept(*this);
00330         os_ << ")";
00331         addr(expr);
00332     }
00333 
00334     virtual void visit(MulExpr *expr)
00335     {
00336         os_ << "*(";
00337         expr->lhs()->accept(*this);
00338         os_ << " , ";
00339         expr->rhs()->accept(*this);
00340         os_ << ")";
00341         addr(expr);
00342     }
00343 
00344     virtual void visit(DivExpr *expr)
00345     {
00346         os_ << "/(";
00347         expr->lhs()->accept(*this);
00348         os_ << " , ";
00349         expr->rhs()->accept(*this);
00350         os_ << ")";
00351         addr(expr);
00352     }
00353 
00354     virtual void visit(ModExpr *expr)
00355     {
00356         os_ << "%(";
00357         expr->lhs()->accept(*this);
00358         os_ << " , ";
00359         expr->rhs()->accept(*this);
00360         os_ << ")";
00361         addr(expr);
00362     }
00363 
00364     virtual void visit(ShlExpr *expr)
00365     {
00366         os_ << "<<(";
00367         expr->lhs()->accept(*this);
00368         os_ << " , ";
00369         expr->rhs()->accept(*this);
00370         os_ << ")";
00371         addr(expr);
00372     }
00373 
00374     virtual void visit(ShrExpr *expr)
00375     {
00376         os_ << ">>(";
00377         expr->lhs()->accept(*this);
00378         os_ << " , ";
00379         expr->rhs()->accept(*this);
00380         os_ << ")";
00381         addr(expr);
00382     }
00383 
00384     virtual void visit(SeqExpr *expr)
00385     {
00386         os_ << "seq: ";
00387         for (unsigned int i=0; i<expr->num_values(); i++) {
00388             if (i != 0) os_ << ",";
00389             os_ << expr->value(i);
00390         }
00391         addr(expr);
00392     }
00393 
00394     virtual void visit(RngExpr *expr)
00395     {
00396         os_ << "rng(" << expr->bindvar() << ",";
00397         expr->from()->accept(*this);
00398         os_ << ",";
00399         expr->to()->accept(*this);
00400         os_ << ")";
00401         addr(expr);
00402     }
00403 
00404     virtual void visit(LogExpr *expr)
00405     {
00406         os_ << "log(";
00407         expr->value()->accept(*this);
00408         os_ << ", ";
00409         expr->base()->accept(*this);
00410         os_ << ")";
00411         addr(expr);
00412     }
00413 };
00414 #endif // __cplusplus
00415 
00416 #ifdef __cplusplus
00417 } // namespace util
00418 } // namespace parameterised
00419 } // namespace sesstype
00420 #endif
00421 
00422 #endif//SESSTYPE__PARAMETERISED__UTIL__PRINT_H__
 All Classes Namespaces Files Functions