diff --git a/Jamfile.v2 b/Jamfile.v2 index ca9d439..50935b7 100644 --- a/Jamfile.v2 +++ b/Jamfile.v2 @@ -28,6 +28,7 @@ exe quickbook post_process.cpp collector.cpp template.cpp + grammar.cpp phrase_grammar.cpp phrase_markup_grammar.cpp phrase_actions.cpp diff --git a/block_actions.cpp b/block_actions.cpp index d127d66..230b61f 100644 --- a/block_actions.cpp +++ b/block_actions.cpp @@ -15,7 +15,7 @@ #include "actions.hpp" #include "state.hpp" #include "quickbook.hpp" -#include "grammars.hpp" +#include "code_snippet_grammar.hpp" #include "code_snippet_types.hpp" #include "utils.hpp" diff --git a/block_grammar.cpp b/block_grammar.cpp index 1814308..0240bc7 100644 --- a/block_grammar.cpp +++ b/block_grammar.cpp @@ -13,7 +13,8 @@ #include #include #include -#include "block_grammar.hpp" +#include "grammar_impl.hpp" +#include "block.hpp" #include "template.hpp" #include "actions.hpp" #include "code.hpp" @@ -37,25 +38,15 @@ namespace quickbook namespace qi = boost::spirit::qi; namespace ph = boost::phoenix; - 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) + void quickbook_grammar::impl::init_block() { - init_block_markup(); - qi::rule& blocks = store_.create(); qi::rule& code = store_.create(); qi::rule& list = store_.create(); qi::rule& hr = store_.create(); qi::rule& paragraph = store_.create(); - start_ = + block_start = blocks >> blank ; diff --git a/block_grammar.hpp b/block_grammar.hpp deleted file mode 100644 index a770f63..0000000 --- a/block_grammar.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/*============================================================================= - 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 start_; - qi::rule block_markup; - - void init_block_markup(); - }; -} \ No newline at end of file diff --git a/block_markup_grammar.cpp b/block_markup_grammar.cpp index 7ca4e50..ab5097f 100644 --- a/block_markup_grammar.cpp +++ b/block_markup_grammar.cpp @@ -16,7 +16,8 @@ #include #include #include -#include "block_grammar.hpp" +#include "grammar_impl.hpp" +#include "block.hpp" #include "template.hpp" #include "actions.hpp" #include "code.hpp" @@ -98,7 +99,7 @@ namespace quickbook namespace qi = boost::spirit::qi; namespace ph = boost::phoenix; - void block_grammar::rules::init_block_markup() + void quickbook_grammar::impl::init_block_markup() { qi::rule& begin_section = store_.create(); qi::rule& end_section = store_.create(); diff --git a/code_snippet_actions.cpp b/code_snippet_actions.cpp index cdef032..a4942d3 100644 --- a/code_snippet_actions.cpp +++ b/code_snippet_actions.cpp @@ -16,7 +16,7 @@ #include #include #include "utils.hpp" -#include "grammars.hpp" +#include "grammar.hpp" #include "code_snippet_types.hpp" #include "template.hpp" diff --git a/code_snippet_grammar.cpp b/code_snippet_grammar.cpp index 30b82fb..27557f0 100644 --- a/code_snippet_grammar.cpp +++ b/code_snippet_grammar.cpp @@ -13,7 +13,7 @@ #include #include "fwd.hpp" #include "code_snippet_types.hpp" -#include "grammars.hpp" +#include "code_snippet_grammar.hpp" #include "misc_rules.hpp" namespace quickbook diff --git a/code_snippet_grammar.hpp b/code_snippet_grammar.hpp new file mode 100644 index 0000000..065a922 --- /dev/null +++ b/code_snippet_grammar.hpp @@ -0,0 +1,55 @@ +/*============================================================================= + Copyright (c) 2002 2004 2006 Joel de Guzman + Copyright (c) 2004 Eric Niebler + Copyright (c) 2010 Daniel James + 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) +=============================================================================*/ +#if !defined(BOOST_SPIRIT_QUICKBOOK_CODE_SNIPPET_GRAMMARS_HPP) +#define BOOST_SPIRIT_QUICKBOOK_CODE_SNIPPET_GRAMMARS_HPP + +#include +#include +#include "fwd.hpp" + +namespace quickbook +{ + namespace qi = boost::spirit::qi; + + struct python_code_snippet_grammar + : qi::grammar + { + typedef code_snippet_actions actions_type; + + python_code_snippet_grammar(actions_type& actions); + ~python_code_snippet_grammar(); + + struct rules; + boost::scoped_ptr rules_pimpl; + qi::rule start; + private: + python_code_snippet_grammar(python_code_snippet_grammar const&); + python_code_snippet_grammar& operator=(python_code_snippet_grammar const&); + }; + + struct cpp_code_snippet_grammar + : qi::grammar + { + typedef code_snippet_actions actions_type; + + cpp_code_snippet_grammar(actions_type& actions); + ~cpp_code_snippet_grammar(); + + struct rules; + boost::scoped_ptr rules_pimpl; + qi::rule start; + private: + cpp_code_snippet_grammar(cpp_code_snippet_grammar const&); + cpp_code_snippet_grammar& operator=(cpp_code_snippet_grammar const&); + }; +} + +#endif // BOOST_SPIRIT_QUICKBOOK_CODE_SNIPPET_GRAMMARS_HPP diff --git a/doc_info_grammar.cpp b/doc_info_grammar.cpp index 27886ec..8db5eb7 100644 --- a/doc_info_grammar.cpp +++ b/doc_info_grammar.cpp @@ -8,12 +8,6 @@ http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ -#include "doc_info.hpp" -#include "grammars.hpp" -#include "actions.hpp" -#include "state.hpp" -#include "parse_utils.hpp" -#include "misc_rules.hpp" #include #include #include @@ -25,6 +19,12 @@ #include #include #include +#include "doc_info.hpp" +#include "grammar_impl.hpp" +#include "actions.hpp" +#include "state.hpp" +#include "parse_utils.hpp" +#include "misc_rules.hpp" namespace quickbook { @@ -52,38 +52,25 @@ namespace quickbook qbk_version_n = (qbk_major_version * 100) + qbk_minor_version; } - struct doc_info_grammar::rules + void quickbook_grammar::impl::init_doc_info() { - rules(quickbook::actions& actions); - - quickbook::actions& actions; - bool unused; - phrase_grammar common; - qi::symbols doc_types; - qi::rule doc_info_details; - qi::rule()> quickbook_version; - qi::rule phrase; - qi::rule doc_version, doc_id, doc_dirname, doc_category, doc_last_revision; - qi::rule doc_source_mode; // TODO: raw_source - qi::rule doc_purpose, doc_license; - qi::rule, std::string>()> doc_copyright; - qi::rule >()> doc_authors; + qi::symbols& doc_types = store_.create(); + qi::rule()>& quickbook_version = store_.create(); + qi::rule& phrase = store_.create(); + qi::rule& doc_version = store_.create(); + qi::rule& doc_id = store_.create(); + qi::rule& doc_dirname = store_.create(); + qi::rule& doc_category = store_.create(); + qi::rule& doc_last_revision = store_.create(); + qi::rule& doc_source_mode = store_.create(); // TODO: raw_source + qi::rule& doc_purpose = store_.create(); + qi::rule& doc_license = store_.create(); + qi::rule, std::string>()>& doc_copyright = store_.create(); + qi::rule >()>& doc_authors = store_.create(); qi::rule >()> doc_author; - qi::rule raw_phrase; - }; + std::pair >()>& doc_author = store_.create(); + qi::rule& raw_phrase = store_.create(); - doc_info_grammar::doc_info_grammar(quickbook::actions& actions) - : doc_info_grammar::base_type(start) - , rules_pimpl(new rules(actions)) - , start(rules_pimpl->doc_info_details) {} - - doc_info_grammar::~doc_info_grammar() {} - - - doc_info_grammar::rules::rules(quickbook::actions& actions) - : actions(actions), unused(false), common(actions, unused) - { typedef qi::uint_parser uint2_t; doc_types = diff --git a/grammar.cpp b/grammar.cpp new file mode 100644 index 0000000..5f5939d --- /dev/null +++ b/grammar.cpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2002 2004 2006 Joel de Guzman + Copyright (c) 2004 Eric Niebler + Copyright (c) 2010 Daniel James + 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 "grammar_impl.hpp" + +namespace quickbook +{ + quickbook_grammar::quickbook_grammar(quickbook::actions& a) + : impl_(new impl(a)) + , phrase(impl_->common, "phrase") + , simple_phrase(impl_->simple_phrase, "simple_phrase") + , block(impl_->block_start, "block") + , doc_info(impl_->doc_info_details, "doc_info") + { + } + + quickbook_grammar::~quickbook_grammar() + { + } + + quickbook_grammar::impl::impl(quickbook::actions& a) + : actions(a) + , no_eols(true) + , store_() + { + init_phrase(); + init_phrase_markup(); + init_block(); + init_block_markup(); + init_doc_info(); + } +} diff --git a/grammar.hpp b/grammar.hpp new file mode 100644 index 0000000..0090336 --- /dev/null +++ b/grammar.hpp @@ -0,0 +1,41 @@ +/*============================================================================= + Copyright (c) 2002 2004 2006 Joel de Guzman + Copyright (c) 2004 Eric Niebler + Copyright (c) 2010 Daniel James + 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) +=============================================================================*/ +#if !defined(BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP) +#define BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP + +#include +#include +#include "fwd.hpp" + +namespace quickbook +{ + namespace qi = boost::spirit::qi; + + class quickbook_grammar + { + public: + struct impl; + + private: + boost::scoped_ptr impl_; + + public: + qi::grammar phrase; + qi::grammar simple_phrase; + qi::grammar block; + qi::grammar doc_info; + + quickbook_grammar(quickbook::actions&); + ~quickbook_grammar(); + }; +} + +#endif // BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP diff --git a/grammar_impl.hpp b/grammar_impl.hpp new file mode 100644 index 0000000..6a67ae5 --- /dev/null +++ b/grammar_impl.hpp @@ -0,0 +1,55 @@ +/*============================================================================= + Copyright (c) 2002 2004 2006 Joel de Guzman + Copyright (c) 2004 Eric Niebler + Copyright (c) 2010 Daniel James + 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) +=============================================================================*/ +#if !defined(BOOST_SPIRIT_QUICKBOOK_GRAMMARS_IMPL_HPP) +#define BOOST_SPIRIT_QUICKBOOK_GRAMMARS_IMPL_HPP + +#include +#include +#include "fwd.hpp" +#include "rule_store.hpp" +#include "grammar.hpp" + +namespace quickbook +{ + namespace qi = boost::spirit::qi; + + struct quickbook_grammar::impl + { + quickbook::actions& actions; + bool no_eols; + rule_store store_; + + // phrase + qi::rule common; + qi::rule simple_phrase; + qi::rule phrase; + qi::rule phrase_markup; + + // block + qi::rule block_start; + qi::rule block_markup; + + // doc_info + qi::rule doc_info_details; + + impl(quickbook::actions&); + + private: + + void init_phrase(); + void init_phrase_markup(); + void init_block(); + void init_block_markup(); + void init_doc_info(); + }; +} + +#endif // BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP diff --git a/grammars.hpp b/grammars.hpp deleted file mode 100644 index 413354f..0000000 --- a/grammars.hpp +++ /dev/null @@ -1,106 +0,0 @@ -/*============================================================================= - 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) -=============================================================================*/ -#if !defined(BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP) -#define BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP - -#include -#include -#include "fwd.hpp" - -namespace quickbook -{ - namespace qi = boost::spirit::qi; - - struct phrase_grammar : qi::grammar - { - phrase_grammar(quickbook::actions& actions, bool& no_eols); - ~phrase_grammar(); - - struct rules; - boost::scoped_ptr rules_pimpl; - qi::rule start; - private: - phrase_grammar(phrase_grammar const&); - phrase_grammar& operator=(phrase_grammar const&); - }; - - struct simple_phrase_grammar : qi::grammar - { - simple_phrase_grammar(quickbook::actions& actions); - ~simple_phrase_grammar(); - - struct rules; - boost::scoped_ptr rules_pimpl; - qi::rule start; - private: - simple_phrase_grammar(simple_phrase_grammar const&); - simple_phrase_grammar& operator=(simple_phrase_grammar const&); - }; - - struct block_grammar : qi::grammar - { - block_grammar(quickbook::actions& actions); - ~block_grammar(); - - struct rules; - boost::scoped_ptr rules_pimpl; - qi::rule start; - private: - block_grammar(block_grammar const&); - block_grammar& operator=(block_grammar const&); - }; - - struct doc_info_grammar : qi::grammar - { - doc_info_grammar(quickbook::actions& actions); - ~doc_info_grammar(); - - struct rules; - boost::scoped_ptr rules_pimpl; - qi::rule start; - private: - doc_info_grammar(doc_info_grammar const&); - doc_info_grammar& operator=(doc_info_grammar const&); - }; - - struct python_code_snippet_grammar - : qi::grammar - { - typedef code_snippet_actions actions_type; - - python_code_snippet_grammar(actions_type& actions); - ~python_code_snippet_grammar(); - - struct rules; - boost::scoped_ptr rules_pimpl; - qi::rule start; - private: - python_code_snippet_grammar(python_code_snippet_grammar const&); - python_code_snippet_grammar& operator=(python_code_snippet_grammar const&); - }; - - struct cpp_code_snippet_grammar - : qi::grammar - { - typedef code_snippet_actions actions_type; - - cpp_code_snippet_grammar(actions_type& actions); - ~cpp_code_snippet_grammar(); - - struct rules; - boost::scoped_ptr rules_pimpl; - qi::rule start; - private: - cpp_code_snippet_grammar(cpp_code_snippet_grammar const&); - cpp_code_snippet_grammar& operator=(cpp_code_snippet_grammar const&); - }; -} - -#endif // BOOST_SPIRIT_QUICKBOOK_GRAMMARS_HPP diff --git a/phrase_grammar.cpp b/phrase_grammar.cpp index 8c9d957..2cbc820 100644 --- a/phrase_grammar.cpp +++ b/phrase_grammar.cpp @@ -36,20 +36,8 @@ namespace quickbook namespace qi = boost::spirit::qi; namespace ph = boost::phoenix; - phrase_grammar::phrase_grammar(quickbook::actions& actions, bool& no_eols) - : phrase_grammar::base_type(start, "phrase") - , rules_pimpl(new rules(actions, no_eols)) + void quickbook_grammar::impl::init_phrase() { - start = rules_pimpl->common; - } - - phrase_grammar::~phrase_grammar() {} - - phrase_grammar::rules::rules(quickbook::actions& actions, bool& no_eols) - : actions(actions), no_eols(no_eols) - { - init_phrase_markup(); - qi::rule& macro = store_.create(); qi::rule& code_block = store_.create(); qi::rule& inline_code = store_.create(); @@ -57,6 +45,13 @@ namespace quickbook qi::rule& escape = store_.create(); qi::rule& phrase_end = store_.create(); + simple_phrase = + *( common + | comment + | (qi::char_ - ']') [actions.process] + ) + ; + phrase = qi::eps [actions.phrase_push] >> *( common @@ -197,32 +192,4 @@ namespace quickbook ; // past a single block, except // when preformatted. } - - struct simple_phrase_grammar::rules - { - rules(quickbook::actions& actions); - - quickbook::actions& actions; - bool unused; - phrase_grammar common; - qi::rule phrase; - }; - - simple_phrase_grammar::simple_phrase_grammar(quickbook::actions& actions) - : simple_phrase_grammar::base_type(start, "simple_phrase") - , rules_pimpl(new rules(actions)) - , start(rules_pimpl->phrase) {} - - simple_phrase_grammar::~simple_phrase_grammar() {} - - simple_phrase_grammar::rules::rules(quickbook::actions& actions) - : actions(actions), unused(false), common(actions, unused) - { - phrase = - *( common - | comment - | (qi::char_ - ']') [actions.process] - ) - ; - } } diff --git a/phrase_grammar.hpp b/phrase_grammar.hpp index 2045a2b..83d566c 100644 --- a/phrase_grammar.hpp +++ b/phrase_grammar.hpp @@ -9,29 +9,8 @@ =============================================================================*/ #include -#include "grammars.hpp" +#include "grammar_impl.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 common; - qi::rule phrase; - qi::rule phrase_markup; - - void init_phrase_markup(); - }; -} BOOST_FUSION_ADAPT_STRUCT( quickbook::break_, diff --git a/phrase_markup_grammar.cpp b/phrase_markup_grammar.cpp index ad972c5..de2b43d 100644 --- a/phrase_markup_grammar.cpp +++ b/phrase_markup_grammar.cpp @@ -68,7 +68,7 @@ namespace quickbook namespace qi = boost::spirit::qi; namespace ph = boost::phoenix; - void phrase_grammar::rules::init_phrase_markup() + void quickbook_grammar::impl::init_phrase_markup() { qi::rule& callout_link = store_.create(); qi::rule& cond_phrase = store_.create(); diff --git a/quickbook.cpp b/quickbook.cpp index d2a5df5..be31dad 100644 --- a/quickbook.cpp +++ b/quickbook.cpp @@ -20,7 +20,7 @@ #include "quickbook.hpp" #include "state.hpp" #include "actions.hpp" -#include "grammars.hpp" +#include "grammar.hpp" #include "post_process.hpp" #include "utils.hpp" #include "input_path.hpp" @@ -67,8 +67,8 @@ namespace quickbook doc_info info; actions actor(state_); - doc_info_grammar l(actor); - bool success = parse(first, last, l, info); + quickbook_grammar g(actor); + bool success = parse(first, last, g.doc_info, info); if (success || ignore_docinfo) { @@ -78,8 +78,7 @@ namespace quickbook actor.process(info); - block_grammar g(actor); - success = parse(first, last, g); + success = parse(first, last, g.block); if (success && first == last) { actor.process(doc_info_post(info)); diff --git a/syntax_highlight_grammar.cpp b/syntax_highlight_grammar.cpp index b7d4564..449c1ef 100644 --- a/syntax_highlight_grammar.cpp +++ b/syntax_highlight_grammar.cpp @@ -13,8 +13,8 @@ #include #include #include +#include "grammar.hpp" #include "actions.hpp" -#include "grammars.hpp" #include "phrase.hpp" #include "utils.hpp" #include "syntax_highlight.hpp" @@ -36,11 +36,10 @@ namespace quickbook : actions(actions) {} void operator()(boost::iterator_range escaped, unused_type, unused_type) const { - bool unused; - phrase_grammar common(actions, unused); + quickbook_grammar g(actions); iterator first = escaped.begin(), last = escaped.end(); while(first != last) { - if(!qi::parse(first, last, common)) { + if(!qi::parse(first, last, g.phrase)) { actions.process(*first); ++first; } diff --git a/template.cpp b/template.cpp index 3c2709b..6558d73 100644 --- a/template.cpp +++ b/template.cpp @@ -10,7 +10,7 @@ #include #include "template.hpp" #include "phrase_actions.hpp" -#include "grammars.hpp" +#include "grammar.hpp" #include "state.hpp" #include "utils.hpp" @@ -325,19 +325,19 @@ namespace quickbook else if (!is_block) { quickbook::actions actions(state); - simple_phrase_grammar phrase_p(actions); + quickbook_grammar g(actions); // do a phrase level parse iterator first(body.begin(), body.end(), state.filename.native_file_string().c_str()); first.set_position(template_pos); iterator last(body.end(), body.end()); - r = boost::spirit::qi::parse(first, last, phrase_p) && first == last; + r = boost::spirit::qi::parse(first, last, g.simple_phrase) && first == last; state.phrase.swap(result); } else { quickbook::actions actions(state); - block_grammar block_p(actions); + quickbook_grammar g(actions); // do a block level parse // ensure that we have enough trailing newlines to eliminate @@ -353,7 +353,7 @@ namespace quickbook while (first != last && ((*first == '\r') || (*first == '\n'))) ++first; // skip initial newlines - r = boost::spirit::qi::parse(first, last, block_p) && first == last; + r = boost::spirit::qi::parse(first, last, g.block) && first == last; state.phrase.swap(result); }