Synopsis - Cross-Reference
File: /tests/Cxx/src/Encoding.cc1#include <Synopsis/Trace.hh> 2#include <Synopsis/Buffer.hh> 3#include <Synopsis/Lexer.hh> 4#include <Synopsis/SymbolFactory.hh> 5#include <Synopsis/Parser.hh> 6#include <Synopsis/PTree.hh> 7#include <Synopsis/PTree/Writer.hh> 8#include <iostream> 9#include <iomanip> 10#include <fstream> 11 12using namespace Synopsis; 13 14class EncodingFinder : public PTree::Visitor 15{ 16public: 17 EncodingFinder(std::ostream &os) : my_os(os) {} 18 void find(PTree::Node *node) { node->accept(this);} 19private: 20 virtual void visit(PTree::List *node) 21 { 22 if (node->car()) node->car()->accept(this); 23 if (node->cdr()) node->cdr()->accept(this); 24 } 25 26// virtual void visit(PTree::Typedef *node) 27// { 28// my_os << "Typedef : " << std::endl; 29// my_os << "type specifier : " << PTree::reify(PTree::second(node)) << std::endl; 30// my_os << "typedef name : " << PTree::reify(PTree::third(node)) << std::endl; 31// } 32 33 virtual void visit(PTree::Name *node) 34 { 35 PTree::Encoding name = node->encoded_name(); 36 my_os << "Name : " << name << ' ' << name.unmangled() << std::endl; 37 PTree::Node *name_node = name.make_ptree(0); 38 my_os << PTree::reify(name_node) << std::endl; 39 } 40 41 virtual void visit(PTree::ClassSpec *node) 42 { 43 PTree::Encoding name = node->encoded_name(); 44 my_os << "ClassSpec : " << name << ' ' << name.unmangled() << std::endl; 45 PTree::Node *name_node = name.make_ptree(0); 46 my_os << PTree::reify(name_node) << std::endl; 47 // Visit the body, if there is one. 48 if(PTree::length(node) == 4) 49 PTree::nth(node, 3)->accept(this); 50 } 51 52 virtual void visit(PTree::EnumSpec *node) 53 { 54 PTree::Encoding name = node->encoded_name(); 55 my_os << "EnumSpec : " << name << ' ' << name.unmangled() << std::endl; 56 PTree::Node *name_node = name.make_ptree(0); 57 my_os << PTree::reify(name_node) << std::endl; 58 } 59 60 virtual void visit(PTree::Declaration *node) 61 { 62 my_os << "Declaration : " << std::endl; 63 my_os << PTree::reify(node) << std::endl; 64 PTree::second(node)->accept(this); 65 PTree::Node *rest = PTree::third(node); 66 if (rest->is_atom()) return; // ';' 67 else if(PTree::is_a(rest, Token::ntDeclarator)) 68 rest->accept(this); 69 else 70 for (; rest; rest = rest->cdr()) 71 { 72 PTree::Node *p = rest->car(); 73 p->accept(this); 74 } 75 } 76 77 virtual void visit(PTree::TemplateDecl *node) 78 { 79 my_os << "TemplateDecl : " << std::endl; 80 my_os << PTree::reify(node) << std::endl; 81 PTree::Node *decl = PTree::nth(node, 4); 82 decl->accept(this); 83 } 84 85 virtual void visit(PTree::Declarator *node) 86 { 87 PTree::Encoding name = node->encoded_name(); 88 my_os << "Declarator : " << name << ' ' << name.unmangled() << std::endl; 89 PTree::Node *name_node = name.make_ptree(0); 90 my_os << PTree::reify(name_node) << std::endl; 91 92 PTree::Encoding type = node->encoded_type(); 93 my_os << "type : " << type << ' ' << type.unmangled() << std::endl; 94 PTree::Node *type_node = type.make_ptree(0); 95 my_os << PTree::reify(type_node) << std::endl; 96 } 97 98 std::ostream &my_os; 99}; 100 101int main(int argc, char **argv) 102{ 103 if (argc < 3) 104 { 105 std::cerr << "Usage: " << argv[0] << " [-d] <output> <input>" << std::endl; 106 exit(-1); 107 } 108 try 109 { 110 std::string output; 111 std::string input; 112 if (argv[1] == std::string("-d")) 113 { 114 Trace::enable(Trace::ALL); 115 output = argv[2]; 116 input = argv[3]; 117 } 118 else 119 { 120 output = argv[1]; 121 input = argv[2]; 122 } 123 std::ofstream ofs(output.c_str()); 124 std::ifstream ifs(input.c_str()); 125 Buffer buffer(ifs.rdbuf(), input); 126 Lexer lexer(&buffer); 127 SymbolFactory symbols; 128 Parser parser(lexer, symbols); 129 EncodingFinder finder(ofs); 130 PTree::Node *node = parser.parse(); 131 finder.find(node); 132 } 133 catch (std::exception const &e) 134 { 135 std::cerr << "Caught exception : " << e.what() << std::endl; 136 } 137}