|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r53021 - in trunk/tools/quickbook: . detail
From: daniel_james_at_[hidden]
Date: 2009-05-15 02:13:18
Author: danieljames
Date: 2009-05-15 02:13:17 EDT (Fri, 15 May 2009)
New Revision: 53021
URL: http://svn.boost.org/trac/boost/changeset/53021
Log:
Separate code snippet grammar and actions.
Text files modified:
trunk/tools/quickbook/code_snippet.hpp | 115 +++++++++++++++++++++++++--------------
trunk/tools/quickbook/detail/actions.cpp | 21 ++++--
2 files changed, 85 insertions(+), 51 deletions(-)
Modified: trunk/tools/quickbook/code_snippet.hpp
==============================================================================
--- trunk/tools/quickbook/code_snippet.hpp (original)
+++ trunk/tools/quickbook/code_snippet.hpp 2009-05-15 02:13:17 EDT (Fri, 15 May 2009)
@@ -15,10 +15,9 @@
namespace quickbook
{
- struct code_snippet_grammar
- : grammar<code_snippet_grammar>
- {
- code_snippet_grammar(std::vector<template_symbol>& storage,
+ struct code_snippet_actions
+ {
+ code_snippet_actions(std::vector<template_symbol>& storage,
std::string const& doc_id,
bool is_python)
: storage(storage)
@@ -26,24 +25,43 @@
, is_python(is_python)
{}
+ void pass_thru(iterator first, iterator last);
+ void escaped_comment(iterator first, iterator last);
+ void compile(iterator first, iterator last);
+ void callout(iterator first, iterator last, char const* role);
+ void inline_callout(iterator first, iterator last);
+ void line_callout(iterator first, iterator last);
+
+ std::string code;
+ std::string snippet;
+ std::string id;
+ std::vector<std::string> callouts;
+ std::vector<template_symbol>& storage;
+ std::string const doc_id;
+ bool const is_python;
+ };
+
+ struct python_code_snippet_grammar
+ : grammar<python_code_snippet_grammar>
+ {
+ typedef code_snippet_actions actions_type;
+
+ python_code_snippet_grammar(actions_type & actions)
+ : actions(actions)
+ {}
+
template <typename Scanner>
struct definition
{
- typedef code_snippet_grammar self_type;
+ typedef code_snippet_actions actions_type;
- definition(self_type const& self)
+ definition(python_code_snippet_grammar const& self)
{
- self.is_python
- ? definition_python(self)
- : definition_cpp(self)
- ;
- }
+ actions_type& actions = self.actions;
- void definition_python(self_type const& self)
- {
start_ =
+(
- snippet [boost::bind(&self_type::compile, &self, _1, _2)]
+ snippet [boost::bind(&actions_type::compile, &actions, _1, _2)]
| anychar_p
)
;
@@ -54,7 +72,7 @@
snippet =
"#[" >> *space_p
- >> identifier [assign_a(self.id)]
+ >> identifier [assign_a(actions.id)]
>> (*(code_elements - "#]"))
>> "#]"
;
@@ -62,7 +80,7 @@
code_elements =
escaped_comment
| ignore
- | (anychar_p - "#]") [boost::bind(&self_type::pass_thru, &self, _1, _2)]
+ | (anychar_p - "#]") [boost::bind(&actions_type::pass_thru, &actions, _1, _2)]
;
ignore =
@@ -80,18 +98,43 @@
escaped_comment =
*space_p >> "#`"
>> ((*(anychar_p - eol_p))
- >> eol_p) [boost::bind(&self_type::escaped_comment, &self, _1, _2)]
+ >> eol_p) [boost::bind(&actions_type::escaped_comment, &actions, _1, _2)]
| *space_p >> "\"\"\"`"
- >> (*(anychar_p - "\"\"\"")) [boost::bind(&self_type::escaped_comment, &self, _1, _2)]
+ >> (*(anychar_p - "\"\"\"")) [boost::bind(&actions_type::escaped_comment, &actions, _1, _2)]
>> "\"\"\""
;
}
-
- void definition_cpp(self_type const& self)
+
+ rule<Scanner>
+ start_, snippet, identifier, code_elements, escaped_comment,
+ inline_callout, line_callout, ignore;
+
+ rule<Scanner> const&
+ start() const { return start_; }
+ };
+
+ actions_type& actions;
+ };
+
+ struct cpp_code_snippet_grammar
+ : grammar<cpp_code_snippet_grammar>
+ {
+ typedef code_snippet_actions actions_type;
+
+ cpp_code_snippet_grammar(actions_type & actions)
+ : actions(actions)
+ {}
+
+ template <typename Scanner>
+ struct definition
+ {
+ definition(cpp_code_snippet_grammar const& self)
{
+ actions_type& actions = self.actions;
+
start_ =
+(
- snippet [boost::bind(&self_type::compile, &self, _1, _2)]
+ snippet [boost::bind(&actions_type::compile, &actions, _1, _2)]
| anychar_p
)
;
@@ -102,12 +145,12 @@
snippet =
"//[" >> *space_p
- >> identifier [assign_a(self.id)]
+ >> identifier [assign_a(actions.id)]
>> (*(code_elements - "//]"))
>> "//]"
|
"/*[" >> *space_p
- >> identifier [assign_a(self.id)]
+ >> identifier [assign_a(actions.id)]
>> *space_p >> "*/"
>> (*(code_elements - "/*]*"))
>> "/*]*/"
@@ -118,18 +161,18 @@
| ignore
| line_callout
| inline_callout
- | (anychar_p - "//]" - "/*]*/") [boost::bind(&self_type::pass_thru, &self, _1, _2)]
+ | (anychar_p - "//]" - "/*]*/") [boost::bind(&actions_type::pass_thru, &actions, _1, _2)]
;
inline_callout =
"/*<"
- >> (*(anychar_p - ">*/")) [boost::bind(&self_type::inline_callout, &self, _1, _2)]
+ >> (*(anychar_p - ">*/")) [boost::bind(&actions_type::inline_callout, &actions, _1, _2)]
>> ">*/"
;
line_callout =
"/*<<"
- >> (*(anychar_p - ">>*/")) [boost::bind(&self_type::line_callout, &self, _1, _2)]
+ >> (*(anychar_p - ">>*/")) [boost::bind(&actions_type::line_callout, &actions, _1, _2)]
>> ">>*/"
>> *space_p
;
@@ -149,9 +192,9 @@
escaped_comment =
*space_p >> "//`"
>> ((*(anychar_p - eol_p))
- >> eol_p) [boost::bind(&self_type::escaped_comment, &self, _1, _2)]
+ >> eol_p) [boost::bind(&actions_type::escaped_comment, &actions, _1, _2)]
| *space_p >> "/*`"
- >> (*(anychar_p - "*/")) [boost::bind(&self_type::escaped_comment, &self, _1, _2)]
+ >> (*(anychar_p - "*/")) [boost::bind(&actions_type::escaped_comment, &actions, _1, _2)]
>> "*/"
;
}
@@ -164,22 +207,8 @@
start() const { return start_; }
};
- void pass_thru(iterator first, iterator last) const;
- void escaped_comment(iterator first, iterator last) const;
- void compile(iterator first, iterator last) const;
- void callout(iterator first, iterator last, char const* role) const;
- void inline_callout(iterator first, iterator last) const;
- void line_callout(iterator first, iterator last) const;
-
- mutable std::string code;
- mutable std::string snippet;
- mutable std::string id;
- mutable std::vector<std::string> callouts;
- std::vector<template_symbol>& storage;
- std::string doc_id;
- bool is_python;
+ actions_type& actions;
};
-
}
#endif // BOOST_SPIRIT_QUICKBOOK_CODE_SNIPPET_HPP
Modified: trunk/tools/quickbook/detail/actions.cpp
==============================================================================
--- trunk/tools/quickbook/detail/actions.cpp (original)
+++ trunk/tools/quickbook/detail/actions.cpp 2009-05-15 02:13:17 EDT (Fri, 15 May 2009)
@@ -968,7 +968,7 @@
out << "\" />\n";
}
- void code_snippet_grammar::pass_thru(iterator first, iterator last) const
+ void code_snippet_actions::pass_thru(iterator first, iterator last)
{
code += *first;
}
@@ -978,7 +978,7 @@
int callout_id = 0;
}
- void code_snippet_grammar::callout(iterator first, iterator last, char const* role) const
+ void code_snippet_actions::callout(iterator first, iterator last, char const* role)
{
using detail::callout_id;
code += "``'''";
@@ -993,17 +993,17 @@
callouts.push_back(std::string(first, last));
}
- void code_snippet_grammar::inline_callout(iterator first, iterator last) const
+ void code_snippet_actions::inline_callout(iterator first, iterator last)
{
callout(first, last, "callout_bug");
}
- void code_snippet_grammar::line_callout(iterator first, iterator last) const
+ void code_snippet_actions::line_callout(iterator first, iterator last)
{
callout(first, last, "line_callout_bug");
}
- void code_snippet_grammar::escaped_comment(iterator first, iterator last) const
+ void code_snippet_actions::escaped_comment(iterator first, iterator last)
{
if (!code.empty())
{
@@ -1024,7 +1024,7 @@
}
}
- void code_snippet_grammar::compile(iterator first, iterator last) const
+ void code_snippet_actions::compile(iterator first, iterator last)
{
using detail::callout_id;
if (!code.empty())
@@ -1088,9 +1088,14 @@
size_t fname_len = file.size();
bool is_python = fname_len >= 3
&& file[--fname_len]=='y' && file[--fname_len]=='p' && file[--fname_len]=='.';
- code_snippet_grammar g(storage, doc_id, is_python);
+ code_snippet_actions a(storage, doc_id, is_python);
// TODO: Should I check that parse succeeded?
- boost::spirit::classic::parse(first, last, g);
+ if(is_python) {
+ boost::spirit::classic::parse(first, last, python_code_snippet_grammar(a));
+ }
+ else {
+ boost::spirit::classic::parse(first, last, cpp_code_snippet_grammar(a));
+ }
return 0;
}
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