Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r63808 - in trunk/tools/quickbook: . detail
From: daniel_james_at_[hidden]
Date: 2010-07-10 07:24:08


Author: danieljames
Date: 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
New Revision: 63808
URL: http://svn.boost.org/trac/boost/changeset/63808

Log:
Use a structure for template symbol info.
Text files modified:
   trunk/tools/quickbook/block.hpp | 5
   trunk/tools/quickbook/detail/actions.cpp | 125 +++++++++++++++++----------------------
   trunk/tools/quickbook/detail/actions_class.cpp | 1
   trunk/tools/quickbook/detail/actions_class.hpp | 1
   trunk/tools/quickbook/detail/template_stack.cpp | 19 ++++-
   trunk/tools/quickbook/detail/template_stack.hpp | 43 ++++++++-----
   trunk/tools/quickbook/phrase.hpp | 8 +
   7 files changed, 103 insertions(+), 99 deletions(-)

Modified: trunk/tools/quickbook/block.hpp
==============================================================================
--- trunk/tools/quickbook/block.hpp (original)
+++ trunk/tools/quickbook/block.hpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -233,8 +233,9 @@
 
                 template_ =
                     "template"
- >> hard_space [clear_a(actions.template_info)]
- >> template_id [push_back_a(actions.template_info)]
+ >> hard_space
+ >> template_id [assign_a(actions.template_identifier)]
+ [clear_a(actions.template_info)]
>>
                     !(
                         space >> '['

Modified: trunk/tools/quickbook/detail/actions.cpp
==============================================================================
--- trunk/tools/quickbook/detail/actions.cpp (original)
+++ trunk/tools/quickbook/detail/actions.cpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -600,19 +600,17 @@
 
     void template_body_action::operator()(iterator first, iterator last) const
     {
- BOOST_ASSERT(actions.template_info.size());
- if (actions.templates.find_top_scope(actions.template_info[0]))
+ if (!actions.templates.add(
+ template_symbol(actions.template_identifier, actions.template_info,
+ std::string(first, last), first.get_position())))
         {
             boost::spirit::classic::file_position const pos = first.get_position();
             detail::outerr(pos.file,pos.line)
- << "Template Redefinition: " << actions.template_info[0] << std::endl;
+ << "Template Redefinition: " << actions.template_identifier << std::endl;
             ++actions.error_count;
         }
 
- actions.template_info.push_back(std::string(first, last));
- actions.templates.add(
- actions.template_info[0]
- , template_symbol(actions.template_info, first.get_position()));
+ actions.template_identifier.clear();
         actions.template_info.clear();
     }
 
@@ -669,8 +667,8 @@
         }
     
         bool break_arguments(
- std::vector<std::string>& template_info
- , std::vector<std::string> const& template_
+ std::vector<std::string>& args
+ , std::vector<std::string> const& params
           , boost::spirit::classic::file_position const& pos
         )
         {
@@ -681,17 +679,16 @@
             // then use whitespace to separate them
             // (2 = template name + argument).
 
- if (qbk_version_n < 105 || template_info.size() == 2)
+ if (qbk_version_n < 105 || args.size() == 1)
             {
- // template_.size() - 1 because template_ also includes the body.
- while (template_info.size() < template_.size()-1 )
+ while (args.size() < params.size() )
                 {
                     // Try to break the last argument at the first space found
- // and push it into the back of template_info. Do this
+ // and push it into the back of args. Do this
                     // recursively until we have all the expected number of
                     // arguments, or if there are no more spaces left.
 
- std::string& str = template_info.back();
+ std::string& str = args.back();
                     std::string::size_type l_pos = find_first_seperator(str);
                     if (l_pos == std::string::npos)
                         break;
@@ -701,17 +698,17 @@
                         break;
                     std::string second(str.begin()+r_pos, str.end());
                     str = first;
- template_info.push_back(second);
+ args.push_back(second);
                 }
             }
 
- if (template_info.size() != template_.size()-1)
+ if (args.size() != params.size())
             {
                 detail::outerr(pos.file, pos.line)
                     << "Invalid number of arguments passed. Expecting: "
- << template_.size()-2
+ << params.size()
                     << " argument(s), got: "
- << template_info.size()-1
+ << args.size()
                     << " argument(s) instead."
                     << std::endl;
                 return false;
@@ -721,56 +718,49 @@
 
         std::pair<bool, std::vector<std::string>::const_iterator>
         get_arguments(
- std::vector<std::string>& template_info
- , std::vector<std::string> const& template_
+ std::vector<std::string>& args
+ , std::vector<std::string> const& params
           , template_scope const& scope
           , boost::spirit::classic::file_position const& pos
           , quickbook::actions& actions
         )
         {
- std::vector<std::string>::const_iterator arg = template_info.begin()+1;
- std::vector<std::string>::const_iterator tpl = template_.begin()+1;
+ std::vector<std::string>::const_iterator arg = args.begin();
+ std::vector<std::string>::const_iterator tpl = params.begin();
+ std::vector<std::string> empty_params;
+
 
             // Store each of the argument passed in as local templates:
- while (arg != template_info.end())
+ while (arg != args.end())
             {
- std::vector<std::string> tinfo;
- tinfo.push_back(*tpl);
- tinfo.push_back(*arg);
- template_symbol template_(tinfo, pos, &scope);
-
- if (actions.templates.find_top_scope(*tpl))
+ if (!actions.templates.add(
+ template_symbol(*tpl, empty_params, *arg, pos, &scope)))
                 {
                     detail::outerr(pos.file,pos.line)
                         << "Duplicate Symbol Found" << std::endl;
                     ++actions.error_count;
                     return std::make_pair(false, tpl);
                 }
- else
- {
- actions.templates.add(*tpl, template_);
- }
                 ++arg; ++tpl;
             }
             return std::make_pair(true, tpl);
         }
 
         bool parse_template(
- std::string& body
+ std::string body
           , std::string& result
           , bool& is_block
           , boost::spirit::classic::file_position const& template_pos
           , quickbook::actions& actions
         )
         {
- simple_phrase_grammar<quickbook::actions> phrase_p(actions);
- block_grammar<quickbook::actions, true> block_p(actions);
-
             // How do we know if we are to parse the template as a block or
             // a phrase? We apply a simple heuristic: if the body starts with
             // a newline, then we regard it as a block, otherwise, we parse
             // it as a phrase.
 
+ body.reserve(body.size() + 2);
+
             std::string::const_iterator iter = body.begin();
             while (iter != body.end() && ((*iter == ' ') || (*iter == '\t')))
                 ++iter; // skip spaces and tabs
@@ -786,6 +776,8 @@
             }
             else if (!is_block)
             {
+ simple_phrase_grammar<quickbook::actions> phrase_p(actions);
+
                 // do a phrase level parse
                 iterator first(body.begin(), body.end(), actions.filename.file_string().c_str());
                 first.set_position(template_pos);
@@ -795,6 +787,8 @@
             }
             else
             {
+ block_grammar<quickbook::actions, true> block_p(actions);
+
                 // do a block level parse
                 // ensure that we have enough trailing newlines to eliminate
                 // the need to check for end of file in the grammar.
@@ -809,13 +803,21 @@
                 actions.inside_paragraph();
                 actions.out.swap(result);
             }
+
             return r;
         }
     }
 
     void do_template_action::operator()(iterator first, iterator) const
     {
+ // Get the arguments and clear values stored in action.
+
+ std::vector<std::string> args;
+ std::string identifier;
+ std::swap(args, actions.template_info);
+ std::swap(identifier, actions.template_identifier);
         boost::spirit::classic::file_position const pos = first.get_position();
+
         ++actions.template_depth;
         if (actions.template_depth > actions.max_template_depth)
         {
@@ -833,8 +835,7 @@
         // arguments are expanded.
         template_scope const& call_scope = actions.templates.top_scope();
 
- template_symbol const* symbol =
- actions.templates.find(actions.template_info[0]);
+ template_symbol const* symbol = actions.templates.find(identifier);
         BOOST_ASSERT(symbol);
             
         std::string result;
@@ -845,26 +846,16 @@
             // [section] and [endsect] tags in the template are balanced.
             actions.min_section_level = actions.section_level;
 
- template_symbol const* symbol =
- actions.templates.find(actions.template_info[0]);
- BOOST_ASSERT(symbol);
-
             // Quickbook 1.4-: When expanding the tempalte continue to use the
             // current scope (the dynamic scope).
             // Quickbook 1.5+: Use the scope the template was defined in
             // (the static scope).
             if (qbk_version_n >= 105)
- actions.templates.set_parent_scope(*boost::get<2>(*symbol));
-
- std::vector<std::string> template_ = boost::get<0>(*symbol);
- boost::spirit::classic::file_position template_pos = boost::get<1>(*symbol);
-
- std::vector<std::string> template_info;
- std::swap(template_info, actions.template_info);
+ actions.templates.set_parent_scope(*symbol->parent);
 
             ///////////////////////////////////
             // Break the arguments
- if (!break_arguments(template_info, template_, pos))
+ if (!break_arguments(args, symbol->params, pos))
             {
                 actions.pop(); // restore the actions' states
                 --actions.template_depth;
@@ -877,7 +868,7 @@
             bool get_arg_result;
             std::vector<std::string>::const_iterator tpl;
             boost::tie(get_arg_result, tpl) =
- get_arguments(template_info, template_,
+ get_arguments(args, symbol->params,
                     call_scope, pos, actions);
 
             if (!get_arg_result)
@@ -889,17 +880,15 @@
 
             ///////////////////////////////////
             // parse the template body:
- std::string body;
- body.assign(tpl->begin(), tpl->end());
- body.reserve(body.size()+2); // reserve 2 more
 
- if (!parse_template(body, result, is_block, template_pos, actions))
+ if (!parse_template(symbol->body, result, is_block, symbol->position, actions))
             {
                 boost::spirit::classic::file_position const pos = first.get_position();
                 detail::outerr(pos.file,pos.line)
- << "Expanding template:" << template_info[0] << std::endl
+ << "Expanding template:" << symbol->identifier << std::endl
+ << std::endl
                     << "------------------begin------------------" << std::endl
- << body
+ << symbol->body
                     << "------------------end--------------------" << std::endl
                     << std::endl;
                 actions.pop(); // restore the actions' states
@@ -907,12 +896,12 @@
                 ++actions.error_count;
                 return;
             }
-
+
             if (actions.section_level != actions.min_section_level)
             {
                 boost::spirit::classic::file_position const pos = first.get_position();
                 detail::outerr(pos.file,pos.line)
- << "Mismatched sections in template " << template_info[0] << std::endl;
+ << "Mismatched sections in template " << identifier << std::endl;
                 actions.pop(); // restore the actions' states
                 --actions.template_depth;
                 ++actions.error_count;
@@ -1282,10 +1271,8 @@
             }
         }
 
- std::vector<std::string> tinfo;
- tinfo.push_back(id);
- tinfo.push_back(snippet);
- storage.push_back(template_symbol(tinfo, first.get_position()));
+ std::vector<std::string> empty_params;
+ storage.push_back(template_symbol(id, empty_params, snippet, first.get_position()));
 
         callout_id += callouts.size();
         callouts.clear();
@@ -1366,18 +1353,14 @@
 
         BOOST_FOREACH(template_symbol const& ts, storage)
         {
- std::string tname = boost::get<0>(ts)[0];
- if (actions.templates.find_top_scope(tname))
+ std::string tname = ts.identifier;
+ if (!actions.templates.add(ts))
             {
- boost::spirit::classic::file_position const pos = boost::get<1>(ts);
+ boost::spirit::classic::file_position const pos = ts.position;
                 detail::outerr(pos.file, pos.line)
                     << "Template Redefinition: " << tname << std::endl;
                 ++actions.error_count;
             }
- else
- {
- actions.templates.add(tname, ts);
- }
         }
     }
 

Modified: trunk/tools/quickbook/detail/actions_class.cpp
==============================================================================
--- trunk/tools/quickbook/detail/actions_class.cpp (original)
+++ trunk/tools/quickbook/detail/actions_class.cpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -60,6 +60,7 @@
         , macro_id()
         , list_marks()
         , list_indent(-1)
+ , template_identifier()
         , template_info()
         , template_depth(0)
         , template_escape(false)

Modified: trunk/tools/quickbook/detail/actions_class.hpp
==============================================================================
--- trunk/tools/quickbook/detail/actions_class.hpp (original)
+++ trunk/tools/quickbook/detail/actions_class.hpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -89,6 +89,7 @@
         std::stack<mark_type> list_marks;
         int list_indent;
         std::vector<bool> conditions;
+ std::string template_identifier;
         string_list template_info;
         int template_depth;
         bool template_escape;

Modified: trunk/tools/quickbook/detail/template_stack.cpp
==============================================================================
--- trunk/tools/quickbook/detail/template_stack.cpp (original)
+++ trunk/tools/quickbook/detail/template_stack.cpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -49,13 +49,22 @@
     }
     
     // TODO: Should symbols defined by '[import]' use the current scope?
- void template_stack::add(std::string const& symbol, template_symbol const& ts)
+ bool template_stack::add(template_symbol const& ts)
     {
         BOOST_ASSERT(!scopes.empty());
- boost::spirit::classic::add(scopes.front().symbols, symbol.c_str(),
- boost::get<2>(ts) ? ts :
- template_symbol(boost::get<0>(ts), boost::get<1>(ts), &top_scope()));
- }
+
+ if (this->find_top_scope(ts.identifier)) {
+ return false;
+ }
+
+ template_symbol symbol(ts);
+ if(!ts.parent) symbol.parent = &top_scope();
+
+ boost::spirit::classic::add(scopes.front().symbols, ts.identifier.c_str(),
+ symbol);
+
+ return true;
+ }
     
     void template_stack::push()
     {

Modified: trunk/tools/quickbook/detail/template_stack.hpp
==============================================================================
--- trunk/tools/quickbook/detail/template_stack.hpp (original)
+++ trunk/tools/quickbook/detail/template_stack.hpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -23,23 +23,30 @@
 {
     struct template_scope;
 
- // template symbols with N arguments are stored as follows:
- //
- // vector<std::string>
- // 0: template name
- // 1: template param name[0]
- // 2: template param name[1]
- // ...
- // N: template param name[N-1]
- // N+1: template body
- // file position
- // template scope (only used for 1.5+, 1.4- uses the dynamic scope)
-
- typedef boost::tuple<
- std::vector<std::string>
- , boost::spirit::classic::file_position
- , template_scope const*>
- template_symbol;
+ struct template_symbol
+ {
+ template_symbol(
+ std::string const& identifier,
+ std::vector<std::string> const& params,
+ std::string const& body,
+ boost::spirit::classic::file_position const& position,
+ template_scope const* parent = 0)
+ : identifier(identifier)
+ , params(params)
+ , body(body)
+ , position(position)
+ , parent(parent) {}
+
+ std::string identifier;
+ std::vector<std::string> params;
+ std::string body;
+ boost::spirit::classic::file_position position;
+
+ // This is only used for quickbook 1.5+, 1.4 uses the dynamic scope.
+ // TODO: I should probably call this something like lexical_parent
+ // or static_parent for clarity.
+ template_scope const* parent;
+ };
 
     typedef boost::spirit::classic::symbols<template_symbol> template_symbols;
     
@@ -101,7 +108,7 @@
         template_scope const& top_scope() const;
         // Add the given template symbol to the current scope.
         // If it doesn't have a scope, sets the symbol's scope to the current scope.
- void add(std::string const& symbol, template_symbol const& ts);
+ bool add(template_symbol const&);
         void push();
         void pop();
 

Modified: trunk/tools/quickbook/phrase.hpp
==============================================================================
--- trunk/tools/quickbook/phrase.hpp (original)
+++ trunk/tools/quickbook/phrase.hpp 2010-07-10 07:24:07 EDT (Sat, 10 Jul 2010)
@@ -126,17 +126,19 @@
                         ch_p('`') [assign_a(actions.template_escape,true_)]
                         |
                         eps_p [assign_a(actions.template_escape,false_)]
- ) [clear_a(actions.template_info)]
+ )
>>
                     ( (
                         (eps_p(punct_p)
>> actions.templates.scope
- ) [push_back_a(actions.template_info)]
+ ) [assign_a(actions.template_identifier)]
+ [clear_a(actions.template_info)]
>> !template_args
                     ) | (
                         (actions.templates.scope
>> eps_p(hard_space)
- ) [push_back_a(actions.template_info)]
+ ) [assign_a(actions.template_identifier)]
+ [clear_a(actions.template_info)]
>> space
>> !template_args
                     ) )


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk