Synopsis - Cross-Reference

File: /tests/Cxx/src/Encoding.cc
  1#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}