$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60139 - branches/quickbook-1.5-spirit2
From: daniel_james_at_[hidden]
Date: 2010-03-03 18:31:09
Author: danieljames
Date: 2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
New Revision: 60139
URL: http://svn.boost.org/trac/boost/changeset/60139
Log:
Split up the block and phrase grammars
Added:
   branches/quickbook-1.5-spirit2/block_grammar.hpp   (contents, props changed)
   branches/quickbook-1.5-spirit2/block_markup_grammar.cpp
      - copied, changed from r60138, /branches/quickbook-1.5-spirit2/block_grammar.cpp
   branches/quickbook-1.5-spirit2/phrase_grammar.hpp   (contents, props changed)
   branches/quickbook-1.5-spirit2/phrase_markup_grammar.cpp   (contents, props changed)
Text files modified: 
   branches/quickbook-1.5-spirit2/Jamfile.v2               |     2                                         
   branches/quickbook-1.5-spirit2/block_grammar.cpp        |   414 --------------------------------------- 
   branches/quickbook-1.5-spirit2/block_markup_grammar.cpp |   161 --------------                          
   branches/quickbook-1.5-spirit2/phrase_grammar.cpp       |   284 ---------------------------             
   4 files changed, 19 insertions(+), 842 deletions(-)
Modified: branches/quickbook-1.5-spirit2/Jamfile.v2
==============================================================================
--- branches/quickbook-1.5-spirit2/Jamfile.v2	(original)
+++ branches/quickbook-1.5-spirit2/Jamfile.v2	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -29,9 +29,11 @@
     collector.cpp
     template.cpp
     phrase_grammar.cpp
+    phrase_markup_grammar.cpp
     phrase_actions.cpp
     phrase_image.cpp
     block_grammar.cpp
+    block_markup_grammar.cpp
     block_actions.cpp
     block_list.cpp
     doc_info_grammar.cpp
Modified: branches/quickbook-1.5-spirit2/block_grammar.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/block_grammar.cpp	(original)
+++ branches/quickbook-1.5-spirit2/block_grammar.cpp	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -9,23 +9,16 @@
 =============================================================================*/
 
 #include <boost/spirit/include/qi_core.hpp>
-#include <boost/spirit/include/qi_eol.hpp>
-#include <boost/spirit/include/qi_eps.hpp>
 #include <boost/spirit/include/qi_attr.hpp>
-#include <boost/spirit/include/qi_attr_cast.hpp>
-#include <boost/spirit/include/qi_repeat.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
+#include <boost/spirit/include/qi_eps.hpp>
+#include <boost/spirit/include/qi_eol.hpp>
 #include <boost/fusion/include/adapt_struct.hpp>
-#include "grammars.hpp"
-#include "block.hpp"
+#include "block_grammar.hpp"
 #include "template.hpp"
 #include "actions.hpp"
 #include "parse_utils.hpp"
 #include "code.hpp"
 #include "misc_rules.hpp"
-#include "rule_store.hpp"
 
 BOOST_FUSION_ADAPT_STRUCT(
     quickbook::paragraph,
@@ -40,94 +33,11 @@
     (std::string, content)
 )
 
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::title,
-    (quickbook::raw_source, raw)
-    (std::string, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::begin_section,
-    (boost::optional<std::string>, id)
-    (quickbook::title, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::end_section,
-    (quickbook::file_position, position)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::heading,
-    (int, level)
-    (quickbook::title, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::def_macro,
-    (std::string, macro_identifier)
-    (std::string, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::define_template,
-    (std::string, id)
-    (std::vector<std::string>, params)
-    (quickbook::template_value, body)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::template_value,
-    (quickbook::file_position, position)
-    (std::string, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::variablelist,
-    (std::string, title)
-    (std::vector<quickbook::varlistentry>, entries)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::table,
-    (boost::optional<std::string>, id)
-    (std::string, title)
-    (std::vector<quickbook::table_row>, rows)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::xinclude,
-    (std::string, path)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::import,
-    (std::string, path)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::include,
-    (boost::optional<std::string>, id)
-    (std::string, path)
-)
-
 namespace quickbook
 {
     namespace qi = boost::spirit::qi;
     namespace ph = boost::phoenix;
 
-    struct block_grammar::rules
-    {
-        rules(quickbook::actions& actions_);
-
-        quickbook::actions& actions;
-        bool no_eols;
-        phrase_grammar common;
-        
-        rule_store store_;
-        qi::rule<iterator> start_;
-    };
-
     block_grammar::block_grammar(quickbook::actions& actions_)
         : block_grammar::base_type(start, "block")
         , rules_pimpl(new rules(actions_))
@@ -138,31 +48,13 @@
     block_grammar::rules::rules(quickbook::actions& actions_)
         : actions(actions_), no_eols(true), common(actions, no_eols)
     {
+        init_block_markup();
+
         qi::rule<iterator>& blocks = store_.create();
-        qi::rule<iterator>& block_markup = store_.create();
-        qi::rule<iterator, quickbook::begin_section()>& begin_section = store_.create();
-        qi::rule<iterator, quickbook::end_section()>& end_section = store_.create();
-        qi::rule<iterator, quickbook::heading()>& heading = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& paragraph_block = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& blockquote = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& preformatted = store_.create();
-        qi::rule<iterator, quickbook::def_macro()>& def_macro = store_.create();
-        qi::rule<iterator, quickbook::table()>& table = store_.create();
-        qi::rule<iterator, quickbook::variablelist()>& variablelist = store_.create();
-        qi::rule<iterator, quickbook::xinclude()>& xinclude = store_.create();
-        qi::rule<iterator, quickbook::include()>& include = store_.create();
-        qi::rule<iterator, quickbook::import()>& import = store_.create();
-        qi::rule<iterator, quickbook::define_template()>& define_template = store_.create();
         qi::rule<iterator, quickbook::code()>& code = store_.create();
         qi::rule<iterator, quickbook::list()>& list = store_.create();
         qi::rule<iterator, quickbook::hr()>& hr = store_.create();
         qi::rule<iterator, quickbook::paragraph()>& paragraph = store_.create();
-        qi::rule<iterator, quickbook::title()>& title_phrase = store_.create();
-        qi::rule<iterator, std::string()>& inside_paragraph = store_.create();
-        qi::rule<iterator, std::string()>& phrase_attr = store_.create();
-        qi::rule<iterator>& phrase_end = store_.create();
-        qi::rule<iterator, boost::optional<std::string>()>& element_id = store_.create();
-        qi::rule<iterator>& error = store_.create();
 
         start_ =
             blocks >> blank
@@ -179,234 +71,6 @@
             )
             ;
 
-        block_markup =
-                '[' >> space
-            >>  (   begin_section
-                |   end_section
-                |   heading
-                |   paragraph_block
-                |   blockquote
-                |   preformatted
-                |   def_macro
-                |   table
-                |   variablelist
-                |   xinclude
-                |   include
-                |   import
-                |   define_template
-                )                               [actions.process]
-            >>  (   (space >> ']' >> +eol)
-                |   error
-                )
-            ;
-        
-        begin_section =
-                "section"
-            >>  hard_space
-            >>  element_id
-            >>  title_phrase
-            ;
-
-        end_section =
-                position
-            >>  "endsect"
-            >>  qi::attr(nothing())
-            ;
-
-        qi::symbols<char, int>& heading_symbol = store_.create();
-        heading = heading_symbol >> hard_space >> title_phrase;
-
-        heading_symbol.add
-            ("h1", 1)
-            ("h2", 2)
-            ("h3", 3)
-            ("h4", 4)
-            ("h5", 5)
-            ("h6", 6)
-            ("heading", -1);
-
-        qi::symbols<char, quickbook::formatted_type>& paragraph_blocks = store_.create();
-
-        paragraph_block =
-            paragraph_blocks >> hard_space >> inside_paragraph
-            ;
-
-        paragraph_blocks.add
-            ("blurb", formatted_type("blurb"))
-            ("warning", formatted_type("warning"))
-            ("caution", formatted_type("caution"))
-            ("important", formatted_type("important"))
-            ("note", formatted_type("note"))
-            ("tip", formatted_type("tip"))
-            ;
-
-        blockquote =
-                ':'
-            >>  blank
-            >>  qi::attr(formatted_type("blockquote"))
-            >>  inside_paragraph
-            ;
-
-        preformatted %=
-                "pre"
-            >>  hard_space                      [ph::ref(no_eols) = false]
-            >>  -eol
-            >>  qi::attr(formatted_type("preformatted"))
-            >>  phrase_attr
-            >>  qi::eps                         [ph::ref(no_eols) = true]
-            ;
-
-        def_macro =
-                "def"
-            >>  hard_space
-            >>  macro_identifier
-            >>  blank
-            >>  phrase_attr
-            ;
-
-        qi::rule<iterator, quickbook::table_row()>& table_row = store_.create();
-        qi::rule<iterator, quickbook::table_cell()>& table_cell = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& table_cell_body = store_.create();
-
-        table =
-                "table"
-            >>  (&(*qi::blank >> qi::eol) | hard_space)
-            >>  ((qi::eps(qbk_since(105u)) >> element_id) | qi::eps)
-            >>  (&(*qi::blank >> qi::eol) | space)
-            >>  *(qi::char_ - eol)
-            >>  +eol
-            >>  *table_row
-            ;
-
-        table_row =
-                space
-            >>  '['
-            >>  (   *table_cell >> ']' >> space
-                |   error >> qi::attr(quickbook::table_row())
-                )
-            ;
-
-        table_cell =
-                space
-            >>  '['
-            >>  (   table_cell_body >> ']' >> space
-                |   error >> qi::attr(quickbook::table_cell())
-                )
-            ;
-
-        table_cell_body =
-                qi::attr(formatted_type("cell"))
-            >>  inside_paragraph
-            ;
-
-        qi::rule<iterator, quickbook::varlistentry()>& varlistentry = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& varlistterm = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& varlistterm_body = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& varlistitem = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& varlistitem_body = store_.create();
-
-        variablelist =
-                "variablelist"
-            >>  (&(*qi::blank >> qi::eol) | hard_space)
-            >>  *(qi::char_ - eol)
-            >>  +eol
-            >>  *varlistentry
-            ;
-
-        varlistentry =
-                space
-            >>  '['
-            >>  (   varlistterm
-                >>  +varlistitem
-                >>  ']'
-                >>  space
-                |   error >> qi::attr(quickbook::varlistentry())
-                )
-            ;
-
-        varlistterm =
-                space
-            >>  '['
-            >>  (   varlistterm_body >> ']' >> space
-                |   error >> qi::attr(quickbook::formatted())
-                )
-            ;
-
-        varlistterm_body =
-                qi::attr(formatted_type("varlistterm"))
-            >>  phrase_attr
-            ;
-
-        varlistitem =
-                space
-            >>  '['
-            >>  (   varlistitem_body >> ']' >> space
-                |   error >> qi::attr(quickbook::formatted())
-                )
-            ;
-
-        varlistitem_body =
-                qi::attr(formatted_type("varlistitem"))
-            >>  inside_paragraph
-            ;
-
-        // TODO: Why do these use phrase_end? It doesn't make any sense.
-        xinclude =
-                "xinclude"
-            >>  hard_space
-            >>  *(qi::char_ - phrase_end)
-            >>  qi::attr(nothing())
-            ;
-
-        include =
-                "include"
-            >>  hard_space
-            >>  -(
-                    ':'
-                >>  *((qi::alnum | '_') - qi::space)
-                >>  space
-                )
-            >>  *(qi::char_ - phrase_end)
-            ;
-
-        import =
-                "import"
-            >>  hard_space
-            >>  *(qi::char_ - phrase_end)
-            >>  qi::attr(nothing())
-            ;
-
-        qi::rule<iterator, std::string()>& template_id = store_.create();
-        qi::rule<iterator, quickbook::template_value()>& template_body = store_.create();
-        qi::rule<iterator>& template_body_recurse = store_.create();
-
-        define_template =
-                "template"
-            >>  hard_space
-            >>  template_id
-            >>  -(
-                    space
-                >>  '['
-                >>  *(space >> template_id)
-                >>  space
-                >>  ']'
-                )
-            >>  template_body
-            ;
-
-        template_body =
-                position
-            >>  qi::raw[template_body_recurse]
-            ;
-
-        template_body_recurse =
-                *(  ('[' >> template_body_recurse >> ']')
-                |   (qi::char_ - ']')
-                )
-            >>  space
-            >>  &qi::lit(']')
-            ;
-
         // Blocks indicated by text layout (indentation, leading characters etc.)
 
         qi::rule<iterator>& code_line = store_.create();
@@ -491,73 +155,5 @@
             "variablelist", "import", "template", "warning", "caution",
             "important", "note", "tip", ":"
             ;
-
-        // Block contents
-
-        // Used when the title is used both to generate the title text and
-        // possibly to generate an id (based on the raw source).
-        title_phrase =
-            qi::raw[
-                phrase_attr                     [ph::at_c<1>(qi::_val) = qi::_1]
-            ]                                   [ph::at_c<0>(qi::_val) = qi::_1]
-            ;
-
-        qi::rule<iterator, quickbook::formatted()>& inside_paragraph2 = store_.create();
-
-        inside_paragraph =
-                qi::eps                             [actions.phrase_push]
-            >>  inside_paragraph2                   [actions.process]
-            >>  *(  eol
-                >>  eol
-                >>  inside_paragraph2               [actions.process]
-                )
-            >>  qi::eps                             [actions.phrase_pop]
-            ;
-
-        inside_paragraph2 =
-                qi::attr(formatted_type("paragraph"))
-            >>  phrase_attr;
-
-        phrase_attr =
-                qi::eps                         [actions.phrase_push]        
-            >> *(   common
-                |   comment
-                |   (qi::char_ - phrase_end)    [actions.process]
-                )
-            >>  qi::eps                         [actions.phrase_pop]
-            ;
-
-        // Make sure that we don't go past a single block, except when
-        // preformatted.
-        phrase_end =
-            ']' | qi::eps(ph::ref(no_eols)) >> eol >> eol
-            ;
-
-        // Identifiers
-
-        qi::rule<iterator, std::string()>& element_id_part = store_.create();
-
-        element_id =
-            (   ':'
-            >>  -(qi::eps(qbk_since(105u)) >> space)
-            >>  (
-                    element_id_part
-                |   qi::omit[
-                        qi::raw[qi::eps]        [actions.element_id_warning]
-                    ]
-                )
-            )
-            | qi::eps
-            ;
-
-        element_id_part = +(qi::alnum | qi::char_('_'));
-
-        template_id
-            =   (qi::alpha | '_') >> *(qi::alnum | '_')
-            |   qi::repeat(1)[qi::punct - qi::char_("[]")]
-            ;
-
-        error =
-            qi::raw[qi::eps] [actions.error];
     }
 }
Added: branches/quickbook-1.5-spirit2/block_grammar.hpp
==============================================================================
--- (empty file)
+++ branches/quickbook-1.5-spirit2/block_grammar.hpp	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -0,0 +1,33 @@
+/*=============================================================================
+    Copyright (c) 2002 2004  2006Joel de Guzman
+    Copyright (c) 2004 Eric Niebler
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#include "grammars.hpp"
+#include "block.hpp"
+#include "rule_store.hpp"
+
+namespace quickbook
+{
+    namespace qi = boost::spirit::qi;
+
+    struct block_grammar::rules
+    {
+        rules(quickbook::actions& actions_);
+
+        quickbook::actions& actions;
+        bool no_eols;
+        phrase_grammar common;
+        
+        rule_store store_;
+        qi::rule<iterator> start_;
+        qi::rule<iterator> block_markup;
+
+        void init_block_markup();
+    };
+}
\ No newline at end of file
Copied: branches/quickbook-1.5-spirit2/block_markup_grammar.cpp (from r60138, /branches/quickbook-1.5-spirit2/block_grammar.cpp)
==============================================================================
--- /branches/quickbook-1.5-spirit2/block_grammar.cpp	(original)
+++ branches/quickbook-1.5-spirit2/block_markup_grammar.cpp	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -9,36 +9,19 @@
 =============================================================================*/
 
 #include <boost/spirit/include/qi_core.hpp>
-#include <boost/spirit/include/qi_eol.hpp>
-#include <boost/spirit/include/qi_eps.hpp>
 #include <boost/spirit/include/qi_attr.hpp>
-#include <boost/spirit/include/qi_attr_cast.hpp>
-#include <boost/spirit/include/qi_repeat.hpp>
+#include <boost/spirit/include/qi_eps.hpp>
+#include <boost/spirit/include/qi_eol.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_fusion.hpp>
 #include <boost/fusion/include/adapt_struct.hpp>
-#include "grammars.hpp"
-#include "block.hpp"
+#include "block_grammar.hpp"
 #include "template.hpp"
 #include "actions.hpp"
 #include "parse_utils.hpp"
 #include "code.hpp"
 #include "misc_rules.hpp"
-#include "rule_store.hpp"
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::paragraph,
-    (std::string, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::list_item,
-    (quickbook::file_position, position)
-    (std::string, indent)
-    (char, mark)
-    (std::string, content)
-)
 
 BOOST_FUSION_ADAPT_STRUCT(
     quickbook::title,
@@ -116,30 +99,8 @@
     namespace qi = boost::spirit::qi;
     namespace ph = boost::phoenix;
 
-    struct block_grammar::rules
+    void block_grammar::rules::init_block_markup()
     {
-        rules(quickbook::actions& actions_);
-
-        quickbook::actions& actions;
-        bool no_eols;
-        phrase_grammar common;
-        
-        rule_store store_;
-        qi::rule<iterator> start_;
-    };
-
-    block_grammar::block_grammar(quickbook::actions& actions_)
-        : block_grammar::base_type(start, "block")
-        , rules_pimpl(new rules(actions_))
-        , start(rules_pimpl->start_) {}
-
-    block_grammar::~block_grammar() {}
-
-    block_grammar::rules::rules(quickbook::actions& actions_)
-        : actions(actions_), no_eols(true), common(actions, no_eols)
-    {
-        qi::rule<iterator>& blocks = store_.create();
-        qi::rule<iterator>& block_markup = store_.create();
         qi::rule<iterator, quickbook::begin_section()>& begin_section = store_.create();
         qi::rule<iterator, quickbook::end_section()>& end_section = store_.create();
         qi::rule<iterator, quickbook::heading()>& heading = store_.create();
@@ -153,10 +114,6 @@
         qi::rule<iterator, quickbook::include()>& include = store_.create();
         qi::rule<iterator, quickbook::import()>& import = store_.create();
         qi::rule<iterator, quickbook::define_template()>& define_template = store_.create();
-        qi::rule<iterator, quickbook::code()>& code = store_.create();
-        qi::rule<iterator, quickbook::list()>& list = store_.create();
-        qi::rule<iterator, quickbook::hr()>& hr = store_.create();
-        qi::rule<iterator, quickbook::paragraph()>& paragraph = store_.create();
         qi::rule<iterator, quickbook::title()>& title_phrase = store_.create();
         qi::rule<iterator, std::string()>& inside_paragraph = store_.create();
         qi::rule<iterator, std::string()>& phrase_attr = store_.create();
@@ -164,21 +121,6 @@
         qi::rule<iterator, boost::optional<std::string>()>& element_id = store_.create();
         qi::rule<iterator>& error = store_.create();
 
-        start_ =
-            blocks >> blank
-            ;
-
-        blocks =
-           +(   block_markup
-            |   code                            [actions.process]
-            |   list                            [actions.process]
-            |   hr                              [actions.process]
-            |   comment >> *eol
-            |   paragraph                       [actions.process]
-            |   eol
-            )
-            ;
-
         block_markup =
                 '[' >> space
             >>  (   begin_section
@@ -376,9 +318,9 @@
             >>  qi::attr(nothing())
             ;
 
-        qi::rule<iterator, std::string()>& template_id = store_.create();
         qi::rule<iterator, quickbook::template_value()>& template_body = store_.create();
         qi::rule<iterator>& template_body_recurse = store_.create();
+        qi::rule<iterator, std::string()>& template_id = store_.create();
 
         define_template =
                 "template"
@@ -407,89 +349,9 @@
             >>  &qi::lit(']')
             ;
 
-        // Blocks indicated by text layout (indentation, leading characters etc.)
-
-        qi::rule<iterator>& code_line = store_.create();
-
-        code =
-                position
-            >>  qi::raw[
-                    code_line
-                >>  *(*eol >> code_line)
-                ]
-            >>  +eol
-            >>  qi::attr(true)
-            ;
-
-        code_line =
-                qi::char_(" \t")
-            >>  *(qi::char_ - eol)
-            >>  eol
-            ;
-
-        qi::rule<iterator, quickbook::list_item()>& list_item = store_.create();
-        qi::rule<iterator, std::string()>& list_item_content = store_.create();
-
-        list =
-                &qi::char_("*#")
-            >>  +list_item
-            ;
-        
-        list_item =
-                position
-            >>  *qi::blank
-            >>  qi::char_("*#")
-            >>  qi::omit[*qi::blank]
-            >>  list_item_content
-            ;
-
-        list_item_content =
-            qi::eps[actions.phrase_push] >>
-           *(   common
-            |   (qi::char_ -
-                    (   qi::eol >> *qi::blank >> &(qi::char_('*') | '#')
-                    |   (eol >> eol)
-                    )
-                )                               [actions.process]
-            )
-            >> +eol
-            >> qi::eps[actions.phrase_pop]
-            ;
-
-        hr =
-            qi::omit[
-                "----"
-            >>  *(qi::char_ - eol)
-            >>  +eol
-            ] >> qi::attr(quickbook::hr())
-            ;
-
-        qi::rule<iterator, std::string()>& paragraph_content = store_.create();
-        qi::rule<iterator>& paragraph_end = store_.create();
-        qi::symbols<>& paragraph_end_markups = store_.create();
-
-        paragraph = paragraph_content >> qi::attr(nothing());
-
-        paragraph_content =
-                qi::eps                         [actions.phrase_push]
-            >> *(   common
-                |   (qi::char_ -                // Make sure we don't go past
-                        paragraph_end           // a single block.
-                    )                           [actions.process]
-                )
-            >>  qi::eps                         [actions.phrase_pop]
-            >> (&qi::lit('[') | +eol)
-            ;
-
-        paragraph_end =
-            '[' >> space >> paragraph_end_markups >> hard_space | eol >> eol
-            ;
-
-        paragraph_end_markups =
-            "section", "endsect", "h1", "h2", "h3", "h4", "h5", "h6",
-            "blurb", ":", "pre", "def", "table", "include", "xinclude",
-            "variablelist", "import", "template", "warning", "caution",
-            "important", "note", "tip", ":"
+        template_id
+            =   (qi::alpha | '_') >> *(qi::alnum | '_')
+            |   qi::repeat(1)[qi::punct - qi::char_("[]")]
             ;
 
         // Block contents
@@ -552,12 +414,7 @@
 
         element_id_part = +(qi::alnum | qi::char_('_'));
 
-        template_id
-            =   (qi::alpha | '_') >> *(qi::alnum | '_')
-            |   qi::repeat(1)[qi::punct - qi::char_("[]")]
-            ;
-
         error =
             qi::raw[qi::eps] [actions.error];
     }
-}
+}
\ No newline at end of file
Modified: branches/quickbook-1.5-spirit2/phrase_grammar.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/phrase_grammar.cpp	(original)
+++ branches/quickbook-1.5-spirit2/phrase_grammar.cpp	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -8,38 +8,17 @@
     http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
 
-#include <map>
 #include <boost/spirit/include/qi_core.hpp>
-#include <boost/spirit/include/qi_symbols.hpp>
 #include <boost/spirit/include/qi_attr.hpp>
 #include <boost/spirit/include/qi_eoi.hpp>
-#include <boost/spirit/include/qi_eol.hpp>
 #include <boost/spirit/include/qi_eps.hpp>
-#include <boost/spirit/include/qi_matches.hpp>
-#include <boost/spirit/include/qi_uint.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/fusion/include/std_pair.hpp>
 #include <boost/fusion/include/adapt_struct.hpp>
+#include "phrase_grammar.hpp"
 #include "code.hpp"
-#include "phrase.hpp"
-#include "grammars.hpp"
 #include "actions.hpp"
-#include "template.hpp"
-#include "parse_utils.hpp"
 #include "misc_rules.hpp"
-#include "rule_store.hpp"
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::anchor,
-    (std::string, id)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::link,
-    (quickbook::formatted_type, type)
-    (std::string, destination)
-    (std::string, content)
-)
 
 BOOST_FUSION_ADAPT_STRUCT(
     quickbook::simple_markup,
@@ -48,44 +27,6 @@
 )
 
 BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::break_,
-    (quickbook::file_position, position)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::image,
-    (quickbook::file_position, position)
-    (std::string, image_filename)
-    (quickbook::image::attribute_map, attributes)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::cond_phrase,
-    (std::string, macro_id)
-    (std::string, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::call_template,
-    (quickbook::file_position, position)
-    (bool, escape)
-    (quickbook::template_symbol const*, symbol)
-    (std::vector<quickbook::template_value>, args)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::template_value,
-    (quickbook::file_position, position)
-    (std::string, content)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
-    quickbook::callout_link,
-    (std::string, role)
-    (std::string, identifier)
-)
-
-BOOST_FUSION_ADAPT_STRUCT(
     quickbook::unicode_char,
     (std::string, value)
 )
@@ -94,17 +35,6 @@
 {
     namespace qi = boost::spirit::qi;
     namespace ph = boost::phoenix;
-    
-    struct phrase_grammar::rules
-    {
-        rules(quickbook::actions& actions, bool& no_eols);
-    
-        quickbook::actions& actions;
-        bool& no_eols;
-
-        rule_store store_;
-        qi::rule<iterator> common;        
-    };
 
     phrase_grammar::phrase_grammar(quickbook::actions& actions, bool& no_eols)
         : phrase_grammar::base_type(start, "phrase")
@@ -118,24 +48,13 @@
     phrase_grammar::rules::rules(quickbook::actions& actions, bool& no_eols)
         : actions(actions), no_eols(no_eols)
     {
-        qi::rule<iterator, std::string()>& phrase = store_.create();
+        init_phrase_markup();
+
         qi::rule<iterator>& macro = store_.create();
-        qi::rule<iterator>& phrase_markup = store_.create();
         qi::rule<iterator, quickbook::code()>& code_block = store_.create();
         qi::rule<iterator, quickbook::code()>& inline_code = store_.create();
         qi::rule<iterator, quickbook::simple_markup(), qi::locals<char> >& simple_format = store_.create();
         qi::rule<iterator>& escape = store_.create();
-        qi::rule<iterator, quickbook::callout_link()>& callout_link = store_.create();
-        qi::rule<iterator, quickbook::cond_phrase()>& cond_phrase = store_.create();
-        qi::rule<iterator, quickbook::image()>& image = store_.create();
-        qi::rule<iterator, quickbook::link()>& url = store_.create();
-        qi::rule<iterator, quickbook::link()>& link = store_.create();
-        qi::rule<iterator, quickbook::anchor()>& anchor = store_.create();
-        qi::symbols<char, quickbook::source_mode>& source_mode = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& formatted = store_.create();
-        qi::rule<iterator, quickbook::formatted()>& footnote = store_.create();
-        qi::rule<iterator, quickbook::call_template()>& call_template = store_.create();
-        qi::rule<iterator, quickbook::break_()>& break_ = store_.create();
         qi::rule<iterator>& phrase_end = store_.create();
 
         phrase =
@@ -163,24 +82,6 @@
             )                                       [actions.process]
             ;
 
-        phrase_markup =
-            (   '['
-            >>  (   callout_link
-                |   cond_phrase
-                |   image
-                |   url
-                |   link
-                |   anchor
-                |   source_mode
-                |   formatted
-                |   footnote
-                |   call_template
-                |   break_
-                )
-            >>  ']'
-            )                                       [actions.process]
-            ;
-
         code_block =
                 (
                     "```"
@@ -281,185 +182,6 @@
             >>  qi::attr(nothing())
             ;
 
-        // Don't use this, it's meant to be private.
-        callout_link =
-                "[callout]"
-            >>  *~qi::char_(' ')
-            >>  ' '
-            >>  *~qi::char_(']')
-            >>  qi::attr(nothing())
-            ;
-
-        cond_phrase =
-                '?'
-            >>  blank
-            >>  macro_identifier
-            >>  -phrase
-            ;
-
-        qi::rule<iterator, quickbook::image()>& image_1_4 = store_.create();
-        qi::rule<iterator, quickbook::image()>& image_1_5 = store_.create();
-        qi::rule<iterator, std::string()>& image_filename = store_.create();
-        qi::rule<iterator, quickbook::image::attribute_map()>& image_attributes = store_.create();
-        qi::rule<iterator, std::pair<std::string, std::string>()>& image_attribute = store_.create();
-        qi::rule<iterator, std::string()>& image_attribute_key = store_.create();
-        qi::rule<iterator, std::string()>& image_attribute_value = store_.create();
-
-        image =
-            (qi::eps(qbk_since(105u)) >> image_1_5) |
-            (qi::eps(qbk_before(105u)) >> image_1_4);
-        
-        image_1_4 =
-                position
-            >>  '$'
-            >>  blank
-            >>  *(qi::char_ - phrase_end)
-            >>  &qi::lit(']')
-            ;
-        
-        image_1_5 =
-                position
-            >>  '$'
-            >>  blank
-            >>  image_filename
-            >>  hard_space
-            >>  image_attributes
-            >>  &qi::lit(']')
-            ;
-
-        image_filename = qi::raw[
-                +(qi::char_ - (qi::space | phrase_end | '['))
-            >>  *(
-                    +qi::space
-                >>  +(qi::char_ - (qi::space | phrase_end | '['))
-             )];
-
-        image_attributes = *(image_attribute >> space);
-        
-        image_attribute =
-                '['
-            >>  image_attribute_key
-            >>  space
-            >>  image_attribute_value
-            >>  ']'
-            ;
-            
-        image_attribute_key = *(qi::alnum | '_');
-        image_attribute_value = *(qi::char_ - (phrase_end | '['));
-
-        url =
-                '@'
-            >>  qi::attr("url")
-            >>  *(qi::char_ - (']' | qi::space))
-            >>  (   &qi::lit(']')
-                |   (hard_space >> phrase)
-                )
-            ;
-
-        qi::symbols<char, formatted_type>& link_symbol = store_.create();
-
-        link =
-                link_symbol
-            >>  hard_space
-            >>  *(qi::char_ - (']' | qi::space))
-            >>  (   &qi::lit(']')
-                |   (hard_space >> phrase)
-                )
-            ;
-
-        link_symbol.add
-            ("link", formatted_type("link"))
-            ("funcref", formatted_type("funcref"))
-            ("classref", formatted_type("classref"))
-            ("memberref", formatted_type("memberref"))
-            ("enumref", formatted_type("enumref")) 
-            ("macroref", formatted_type("macroref")) 
-            ("headerref", formatted_type("headerref")) 
-            ("conceptref", formatted_type("conceptref"))
-            ("globalref", formatted_type("globalref"))
-            ;
-
-        anchor =
-                '#'
-            >>  blank
-            >>  *(qi::char_ - phrase_end)
-            >>  qi::attr(nothing())
-            ;
-
-        source_mode.add
-            ("c++", quickbook::source_mode("c++"))
-            ("python", quickbook::source_mode("python"))
-            ("teletype", quickbook::source_mode("teletype"))
-            ;
-
-        qi::symbols<char, formatted_type>& format_symbol = store_.create();
-
-        formatted = format_symbol >> blank >> phrase;
-
-        format_symbol.add
-            ("*", "bold")
-            ("'", "italic")
-            ("_", "underline")
-            ("^", "teletype")
-            ("-", "strikethrough")
-            ("\"", "quote")
-            ("~", "replaceable")
-            ;
-
-        footnote =
-                "footnote"
-            >>  qi::attr("footnote")
-            >>  blank
-            >>  phrase
-            ;
-
-        // Template call
-
-        qi::rule<iterator, std::vector<quickbook::template_value>()>& template_args = store_.create();
-        qi::rule<iterator, quickbook::template_value()>& template_arg_1_4 = store_.create();
-        qi::rule<iterator>& brackets_1_4 = store_.create();
-        qi::rule<iterator, quickbook::template_value()>& template_arg_1_5 = store_.create();
-        qi::rule<iterator>& brackets_1_5 = store_.create();
-
-        call_template =
-                position
-            >>  qi::matches['`']
-            >>  (                                   // Lookup the template name
-                    (&qi::punct >> actions.templates.scope)
-                |   (actions.templates.scope >> hard_space)
-                )
-            >>  template_args
-            >>  &qi::lit(']')
-            ;
-
-        template_args =
-            qi::eps(qbk_before(105u)) >> -(template_arg_1_4 % "..") |
-            qi::eps(qbk_since(105u)) >> -(template_arg_1_5 % "..");
-
-        template_arg_1_4 =
-            position >>
-            qi::raw[+(brackets_1_4 | ~qi::char_(']') - "..")]
-            ;
-
-        brackets_1_4 =
-            '[' >> +(brackets_1_4 | ~qi::char_(']') - "..") >> ']'
-            ;
-
-        template_arg_1_5 =
-            position >>
-            qi::raw[+(brackets_1_5 | '\\' >> qi::char_ | ~qi::char_("[]") - "..")]
-            ;
-
-        brackets_1_5 =
-            '[' >> +(brackets_1_5 | '\\' >> qi::char_ | ~qi::char_("[]")) >> ']'
-            ;
-
-        break_ =
-                position
-            >>  "br"
-            >>  qi::attr(nothing())
-            ;
-
         phrase_end =
             ']' |
             qi::eps(ph::ref(no_eols)) >>
Added: branches/quickbook-1.5-spirit2/phrase_grammar.hpp
==============================================================================
--- (empty file)
+++ branches/quickbook-1.5-spirit2/phrase_grammar.hpp	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -0,0 +1,39 @@
+/*=============================================================================
+    Copyright (c) 2002 2004 2006 Joel de Guzman
+    Copyright (c) 2004 Eric Niebler
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#include <boost/fusion/include/adapt_struct.hpp>
+#include "grammars.hpp"
+#include "phrase.hpp"
+#include "rule_store.hpp"
+
+namespace quickbook
+{
+    namespace qi = boost::spirit::qi;
+
+    struct phrase_grammar::rules
+    {
+        rules(quickbook::actions& actions, bool& no_eols);
+    
+        quickbook::actions& actions;
+        bool& no_eols;
+
+        rule_store store_;
+        qi::rule<iterator> common;        
+        qi::rule<iterator, std::string()> phrase;
+        qi::rule<iterator> phrase_markup;
+        
+        void init_phrase_markup();
+    };
+}
+
+BOOST_FUSION_ADAPT_STRUCT( 
+ quickbook::break_,
+    (quickbook::file_position, position)
+)
\ No newline at end of file
Added: branches/quickbook-1.5-spirit2/phrase_markup_grammar.cpp
==============================================================================
--- (empty file)
+++ branches/quickbook-1.5-spirit2/phrase_markup_grammar.cpp	2010-03-03 18:31:08 EST (Wed, 03 Mar 2010)
@@ -0,0 +1,290 @@
+/*=============================================================================
+    Copyright (c) 2002 2004 2006 Joel de Guzman
+    Copyright (c) 2004 Eric Niebler
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#include <boost/spirit/include/qi_core.hpp>
+#include <boost/spirit/include/qi_symbols.hpp>
+#include <boost/spirit/include/qi_attr.hpp>
+#include <boost/spirit/include/qi_eps.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+#include "phrase_grammar.hpp"
+#include "actions.hpp"
+#include "template.hpp"
+#include "misc_rules.hpp"
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::anchor,
+    (std::string, id)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::link,
+    (quickbook::formatted_type, type)
+    (std::string, destination)
+    (std::string, content)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::image,
+    (quickbook::file_position, position)
+    (std::string, image_filename)
+    (quickbook::image::attribute_map, attributes)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::cond_phrase,
+    (std::string, macro_id)
+    (std::string, content)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::call_template,
+    (quickbook::file_position, position)
+    (bool, escape)
+    (quickbook::template_symbol const*, symbol)
+    (std::vector<quickbook::template_value>, args)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::template_value,
+    (quickbook::file_position, position)
+    (std::string, content)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+    quickbook::callout_link,
+    (std::string, role)
+    (std::string, identifier)
+)
+
+namespace quickbook
+{
+    namespace qi = boost::spirit::qi;
+    namespace ph = boost::phoenix;
+
+    void phrase_grammar::rules::init_phrase_markup()
+    {
+        qi::rule<iterator, quickbook::callout_link()>& callout_link = store_.create();
+        qi::rule<iterator, quickbook::cond_phrase()>& cond_phrase = store_.create();
+        qi::rule<iterator, quickbook::image()>& image = store_.create();
+        qi::rule<iterator, quickbook::link()>& url = store_.create();
+        qi::rule<iterator, quickbook::link()>& link = store_.create();
+        qi::rule<iterator, quickbook::anchor()>& anchor = store_.create();
+        qi::symbols<char, quickbook::source_mode>& source_mode = store_.create();
+        qi::rule<iterator, quickbook::formatted()>& formatted = store_.create();
+        qi::rule<iterator, quickbook::formatted()>& footnote = store_.create();
+        qi::rule<iterator, quickbook::call_template()>& call_template = store_.create();
+        qi::rule<iterator, quickbook::break_()>& break_ = store_.create();
+        qi::rule<iterator>& phrase_end = store_.create();
+
+        phrase_markup =
+            (   '['
+            >>  (   callout_link
+                |   cond_phrase
+                |   image
+                |   url
+                |   link
+                |   anchor
+                |   source_mode
+                |   formatted
+                |   footnote
+                |   call_template
+                |   break_
+                )
+            >>  ']'
+            )                                       [actions.process]
+            ;
+
+        // Don't use this, it's meant to be private.
+        callout_link =
+                "[callout]"
+            >>  *~qi::char_(' ')
+            >>  ' '
+            >>  *~qi::char_(']')
+            >>  qi::attr(nothing())
+            ;
+
+        cond_phrase =
+                '?'
+            >>  blank
+            >>  macro_identifier
+            >>  -phrase
+            ;
+
+        qi::rule<iterator, quickbook::image()>& image_1_4 = store_.create();
+        qi::rule<iterator, quickbook::image()>& image_1_5 = store_.create();
+        qi::rule<iterator, std::string()>& image_filename = store_.create();
+        qi::rule<iterator, quickbook::image::attribute_map()>& image_attributes = store_.create();
+        qi::rule<iterator, std::pair<std::string, std::string>()>& image_attribute = store_.create();
+        qi::rule<iterator, std::string()>& image_attribute_key = store_.create();
+        qi::rule<iterator, std::string()>& image_attribute_value = store_.create();
+
+        image =
+            (qi::eps(qbk_since(105u)) >> image_1_5) |
+            (qi::eps(qbk_before(105u)) >> image_1_4);
+        
+        image_1_4 =
+                position
+            >>  '$'
+            >>  blank
+            >>  *(qi::char_ - phrase_end)
+            >>  &qi::lit(']')
+            ;
+        
+        image_1_5 =
+                position
+            >>  '$'
+            >>  blank
+            >>  image_filename
+            >>  hard_space
+            >>  image_attributes
+            >>  &qi::lit(']')
+            ;
+
+        image_filename = qi::raw[
+                +(qi::char_ - (qi::space | phrase_end | '['))
+            >>  *(
+                    +qi::space
+                >>  +(qi::char_ - (qi::space | phrase_end | '['))
+             )];
+
+        image_attributes = *(image_attribute >> space);
+        
+        image_attribute =
+                '['
+            >>  image_attribute_key
+            >>  space
+            >>  image_attribute_value
+            >>  ']'
+            ;
+            
+        image_attribute_key = *(qi::alnum | '_');
+        image_attribute_value = *(qi::char_ - (phrase_end | '['));
+
+        url =
+                '@'
+            >>  qi::attr("url")
+            >>  *(qi::char_ - (']' | qi::space))
+            >>  (   &qi::lit(']')
+                |   (hard_space >> phrase)
+                )
+            ;
+
+        qi::symbols<char, formatted_type>& link_symbol = store_.create();
+
+        link =
+                link_symbol
+            >>  hard_space
+            >>  *(qi::char_ - (']' | qi::space))
+            >>  (   &qi::lit(']')
+                |   (hard_space >> phrase)
+                )
+            ;
+
+        link_symbol.add
+            ("link", formatted_type("link"))
+            ("funcref", formatted_type("funcref"))
+            ("classref", formatted_type("classref"))
+            ("memberref", formatted_type("memberref"))
+            ("enumref", formatted_type("enumref")) 
+            ("macroref", formatted_type("macroref")) 
+            ("headerref", formatted_type("headerref")) 
+            ("conceptref", formatted_type("conceptref"))
+            ("globalref", formatted_type("globalref"))
+            ;
+
+        anchor =
+                '#'
+            >>  blank
+            >>  *(qi::char_ - phrase_end)
+            >>  qi::attr(nothing())
+            ;
+
+        source_mode.add
+            ("c++", quickbook::source_mode("c++"))
+            ("python", quickbook::source_mode("python"))
+            ("teletype", quickbook::source_mode("teletype"))
+            ;
+
+        qi::symbols<char, formatted_type>& format_symbol = store_.create();
+
+        formatted = format_symbol >> blank >> phrase;
+
+        format_symbol.add
+            ("*", "bold")
+            ("'", "italic")
+            ("_", "underline")
+            ("^", "teletype")
+            ("-", "strikethrough")
+            ("\"", "quote")
+            ("~", "replaceable")
+            ;
+
+        footnote =
+                "footnote"
+            >>  qi::attr("footnote")
+            >>  blank
+            >>  phrase
+            ;
+
+        // Template call
+
+        qi::rule<iterator, std::vector<quickbook::template_value>()>& template_args = store_.create();
+        qi::rule<iterator, quickbook::template_value()>& template_arg_1_4 = store_.create();
+        qi::rule<iterator>& brackets_1_4 = store_.create();
+        qi::rule<iterator, quickbook::template_value()>& template_arg_1_5 = store_.create();
+        qi::rule<iterator>& brackets_1_5 = store_.create();
+
+        call_template =
+                position
+            >>  qi::matches['`']
+            >>  (                                   // Lookup the template name
+                    (&qi::punct >> actions.templates.scope)
+                |   (actions.templates.scope >> hard_space)
+                )
+            >>  template_args
+            >>  &qi::lit(']')
+            ;
+
+        template_args =
+            qi::eps(qbk_before(105u)) >> -(template_arg_1_4 % "..") |
+            qi::eps(qbk_since(105u)) >> -(template_arg_1_5 % "..");
+
+        template_arg_1_4 =
+            position >>
+            qi::raw[+(brackets_1_4 | ~qi::char_(']') - "..")]
+            ;
+
+        brackets_1_4 =
+            '[' >> +(brackets_1_4 | ~qi::char_(']') - "..") >> ']'
+            ;
+
+        template_arg_1_5 =
+            position >>
+            qi::raw[+(brackets_1_5 | '\\' >> qi::char_ | ~qi::char_("[]") - "..")]
+            ;
+
+        brackets_1_5 =
+            '[' >> +(brackets_1_5 | '\\' >> qi::char_ | ~qi::char_("[]")) >> ']'
+            ;
+
+        break_ =
+                position
+            >>  "br"
+            >>  qi::attr(nothing())
+            ;
+
+        phrase_end =
+            ']' |
+            qi::eps(ph::ref(no_eols)) >>
+                eol >> eol                      // Make sure that we don't go
+            ;                                   // past a single block, except
+                                                // when preformatted.
+    }
+}
\ No newline at end of file