コード例 #1
0
ファイル: build_module.cpp プロジェクト: ohjames/nyu
void build_module::close() {
    if (! stream_.is_open()) return;

    if (! module_.first.empty()) {
        open_namespace(module_.first);
        stream_ << body_.str();
        close_namespace(module_.first.size());
    }
    else stream_ << body_.str();

    chilon::print(stream_, "\n#endif");
    stream_ << std::flush;
    stream_.close();
}
コード例 #2
0
ファイル: build_grammar.cpp プロジェクト: ohjames/nyu
void build_grammar::close() {
    compilation_unit::close();

    if (! module_.first.empty())
        open_namespace(module_.first, grammar_.first);
    else
        stream_ << "namespace " << grammar_.first << " {\n";

    stream_ << "\nnamespace " << namespace_alias() << " = chilon::parser;\n";

    stream_ << body_.str();
    close_namespace(module_.first.size() + 1);
    chilon::print(stream_, "\n#endif\n");
    stream_.close();
}
コード例 #3
0
void generate_cpp_modules_visitor::examine_vertex
  (vertex_descriptor v, modules_tree_type const& modules)
{
  namespace karma = boost::spirit::karma;
  namespace phoenix = boost::phoenix;
  typedef boost::property_map<modules_tree_type, module_property_t>
    ::const_type module_map;
  module_map map = get(module_property_t(), modules);
  module const& m = *boost::get(map, v);
  std::cout << "Module " << m.name << std::endl;
  typedef modules_tree_type::in_edge_iterator in_edge_iterator;

  if(state->opened_modules.size() < 2)
  {
    if(!state->opened_modules.empty())
      idl_compiler::open_namespace(state->iterator, m.name);
    state->opened_modules.push_back(v);
  }
  else
  {
    std::pair<in_edge_iterator, in_edge_iterator>
      edges = in_edges(v, modules);
    vertex_descriptor b = source(*edges.first, modules);
    assert(boost::distance(edges) == 1);
    if(state->opened_modules.back() == b)
    {
      std::cout << "Should open " << m.name << std::endl;
      idl_compiler::open_namespace(state->iterator, m.name);
      state->opened_modules.push_back(v);
    }
    else
    {
      module const& before = *boost::get(map, b);
      std::cout << "Should close " << before.name << std::endl;

      *state->iterator++ = '}';
      *state->iterator++ = ' ';
      *state->iterator++ = '/';
      *state->iterator++ = '/';
      state->iterator = std::copy(before.name.begin(), before.name.end(), state->iterator);
      karma::generate(state->iterator, karma::eol);

      state->opened_modules.pop_back();

      std::cout << "And then open " << m.name << std::endl;

      idl_compiler::open_namespace(state->iterator, m.name);
      state->opened_modules.push_back(v);
    }
  }

  morbid::idl_compiler::generator::header_remote_stub_generator
    <output_iterator_type, parser_iterator_type>
    header_remote_stub_generator;
  morbid::idl_compiler::generator::cpp_stub_generator
    <output_iterator_type, parser_iterator_type>
    cpp_stub_generator;

  std::vector<std::string> modules_name;
  for(std::vector<vertex_descriptor>::const_iterator
        first = state->opened_modules.begin()
        , last = state->opened_modules.end()
        ;first != last; ++first)
  {
    module const* mx = &*boost::get(map, *first);
    modules_name.push_back(mx->name);
  }

  if (!m.interfaces.empty())
  {
    
    open_namespace(state->iterator, ""); // anonymous namespace

    for(std::vector<interface_>::const_iterator first = m.interfaces.begin()
          , last = m.interfaces.end(); first != last; ++first)
    {
      std::vector<std::string> base_name(modules_name);
      base_name.push_back(first->definition.name);
      bool r = karma::generate(state->iterator, header_remote_stub_generator
                               (phoenix::val(*first), phoenix::ref(base_name))
                               , first->definition);
      if(!r) throw std::runtime_error("Failed generating header_remote_stub_generator");
    }

    *state->iterator++ = '}';
    karma::generate(state->iterator, karma::eol);
  }

  for(std::vector<interface_>::const_iterator first = m.interfaces.begin()
        , last = m.interfaces.end(); first != last; ++first)
  {
    std::vector<std::string> base_name(boost::next(modules_name.begin()), modules_name.end());
    base_name.push_back(first->definition.name);
    bool r = karma::generate(state->iterator, cpp_stub_generator(phoenix::val(*first), phoenix::ref(base_name))
                             , first->definition);
    if(!r) throw std::runtime_error("Failed generating header_stub_generator");
  }

}
コード例 #4
0
void generate_cpp_poa_modules_visitor::examine_vertex
  (vertex_descriptor v, modules_tree_type const& modules)
{
  namespace karma = boost::spirit::karma;
  namespace phoenix = boost::phoenix;
  typedef boost::property_map<modules_tree_type, module_property_t>
    ::const_type module_map;
  module_map map = get(module_property_t(), modules);
  module const& m = *boost::get(map, v);
  std::cout << "Module " << m.name << std::endl;
  typedef modules_tree_type::in_edge_iterator in_edge_iterator;

  if(!m.interfaces.empty())
  {

  std::vector<std::string> modules_names;
  {
    vertex_descriptor vx = v;
    module const* mx = &*boost::get(map, vx);
    std::pair<in_edge_iterator, in_edge_iterator> edges;
    while(mx->name != "")
    {
      modules_names.push_back(mx->name);

      edges = in_edges(vx, modules);
      vx = source(*edges.first, modules);
      mx = &*boost::get(map, vx);
    }
  }

  bool prepend_poa = modules_names.empty();
  
  if(!prepend_poa)
  {
    std::string name = "POA_" + modules_names.back();
    open_namespace(state->iterator, name);
  }

  for(std::vector<std::string>::const_reverse_iterator
        first = prepend_poa ? modules_names.rbegin() : boost::next(modules_names.rbegin())
        , last = modules_names.rend()
        ;first != last; ++first)
    open_namespace(state->iterator, *first);

  morbid::idl_compiler::generator::cpp_poa_stub_generator
    <output_iterator_type, parser_iterator_type>
    cpp_poa_stub_generator;
  morbid::idl_compiler::generator::header_local_stub_generator
    <output_iterator_type, parser_iterator_type>
    header_local_stub_generator;

  if(!m.interfaces.empty())
  {
    open_namespace(state->iterator, ""); // anonymous namespace

    for(std::vector<interface_>::const_iterator first = m.interfaces.begin()
          , last = m.interfaces.end(); first != last; ++first)
    {
      std::vector<std::string> base_name(modules_names.rbegin(), modules_names.rend());
      bool r = karma::generate(state->iterator, header_local_stub_generator
                               (phoenix::val(*first)
                                , phoenix::val(base_name))
                               , first->definition);
      if(!r) throw std::runtime_error("Failed generating header_local_stub_generator");
    }

    *state->iterator++ = '}';
    karma::generate(state->iterator, karma::eol);
  }

  for(std::vector<interface_>::const_iterator first = m.interfaces.begin()
        , last = m.interfaces.end(); first != last; ++first)
  {
    bool r = karma::generate(state->iterator, cpp_poa_stub_generator(phoenix::val(*first)
                                                                     , prepend_poa)
                             , first->definition);
    if(!r) throw std::runtime_error("Failed generating header_poa_stub_generator");
  }

  for(std::vector<std::string>::const_reverse_iterator
        first = modules_names.rbegin()
        , last = modules_names.rend()
        ;first != last; ++first)
  {
    *state->iterator++ = '}';
    *state->iterator++ = ' ';
    *state->iterator++ = '/';
    *state->iterator++ = '/';
    state->iterator = std::copy(first->begin(), first->end(), state->iterator);
    karma::generate(state->iterator, karma::eol);
  }
  }
}