summaryrefslogtreecommitdiff
path: root/traveler/DotTraveler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'traveler/DotTraveler.cc')
-rw-r--r--traveler/DotTraveler.cc49
1 files changed, 49 insertions, 0 deletions
diff --git a/traveler/DotTraveler.cc b/traveler/DotTraveler.cc
new file mode 100644
index 0000000..daf64ec
--- /dev/null
+++ b/traveler/DotTraveler.cc
@@ -0,0 +1,49 @@
+#include "DotTraveler.hh"
+
+namespace pcc {
+DotTraveler::DotTraveler(std::ostream& out)
+ : Traveler(out)
+ , CurrentIndex_(0) {}
+
+void DotTraveler::PreTravel() {
+ out_ << "digraph \"AST dump\"\n"
+ "{\n"
+ " node [fontname = courier, shape = box, colorscheme = paired6]\n"
+ " edge [fontname = courier]\n\n";
+}
+
+void DotTraveler::PostTravel() { out_ << "}\n"; }
+
+Traveler& DotTraveler::operator<<(TravelPart part) {
+ switch (part) {
+ case TravelPart::PREFIX:
+ out_ << " " << CurrentIndex_ << " [label=\"";
+ NodeIndex_.push(CurrentIndex_);
+ ++CurrentIndex_;
+ break;
+ case TravelPart::NAME_BEGIN:
+ case TravelPart::DESCRPTION_BEGIN:
+ break;
+ case TravelPart::NAME_END:
+ out_ << "\\n\\n";
+ break;
+ case TravelPart::DESCRPTION_END:
+ out_ << "\"]\n";
+ break;
+ case TravelPart::CHILD_BEGIN:
+ case TravelPart::LAST_CHILD_BEGIN:
+ out_ << " " << NodeIndex_.top() << " -> " << CurrentIndex_
+ << " [style=solid]\n";
+ break;
+ case TravelPart::CHILD_END:
+ case TravelPart::LAST_CHILD_END:
+ break;
+ case TravelPart::END:
+ NodeIndex_.pop();
+ break;
+ default:
+ break;
+ }
+ return *this;
+}
+} // namespace pcc