summaryrefslogtreecommitdiff
path: root/tools/quickbook/src/phrase_element_grammar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/quickbook/src/phrase_element_grammar.cpp')
-rw-r--r--tools/quickbook/src/phrase_element_grammar.cpp87
1 files changed, 53 insertions, 34 deletions
diff --git a/tools/quickbook/src/phrase_element_grammar.cpp b/tools/quickbook/src/phrase_element_grammar.cpp
index 7a4e3c0a09..b287d63621 100644
--- a/tools/quickbook/src/phrase_element_grammar.cpp
+++ b/tools/quickbook/src/phrase_element_grammar.cpp
@@ -9,7 +9,8 @@
=============================================================================*/
#include "grammar_impl.hpp"
-#include "actions_class.hpp"
+#include "state.hpp"
+#include "actions.hpp"
#include "utils.hpp"
#include "phrase_tags.hpp"
#include <boost/spirit/include/classic_core.hpp>
@@ -27,7 +28,7 @@ namespace quickbook
{
cl::rule<scanner>
image, anchor, link, empty, cond_phrase, inner_phrase,
- role
+ role, source_mode
;
};
@@ -36,15 +37,19 @@ namespace quickbook
phrase_element_grammar_local& local = cleanup_.add(
new phrase_element_grammar_local);
+ error_action error(state);
+ raw_char_action raw_char(state.phrase);
+ scoped_parser<cond_phrase_push> scoped_cond_phrase(state);
+ scoped_parser<to_value_scoped_action> to_value(state);
+
elements.add
("?", element_info(element_info::phrase, &local.cond_phrase))
;
local.cond_phrase =
blank
- >> macro_identifier [actions.values.entry(ph::arg1, ph::arg2)]
- >> actions.scoped_cond_phrase()
- [extended_phrase]
+ >> macro_identifier [state.values.entry(ph::arg1, ph::arg2)]
+ >> scoped_cond_phrase() [extended_phrase]
;
elements.add
@@ -54,37 +59,37 @@ namespace quickbook
// Note that the attribute values here are encoded in plain text not
// boostbook.
local.image =
- qbk_since(105u)
+ qbk_ver(105u)
>> blank
- >> ( qbk_before(106u)
+ >> ( qbk_ver(0, 106u)
>> (+(
*cl::space_p
>> +(cl::anychar_p - (cl::space_p | phrase_end | '['))
- )) [actions.values.entry(ph::arg1, ph::arg2)]
- | qbk_since(106u)
- >> actions.to_value()
+ )) [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u)
+ >> to_value()
[ +( raw_escape
| (+cl::space_p >> ~cl::eps_p(phrase_end | '['))
- [actions.raw_char]
+ [raw_char]
| (cl::anychar_p - (cl::space_p | phrase_end | '['))
- [actions.raw_char]
+ [raw_char]
)
]
)
>> hard_space
- >> *actions.values.list()
+ >> *state.values.list()
[ '['
>> (*(cl::alnum_p | '_'))
- [actions.values.entry(ph::arg1, ph::arg2)]
+ [state.values.entry(ph::arg1, ph::arg2)]
>> space
- >> ( qbk_before(106u)
+ >> ( qbk_ver(0, 106u)
>> (*(cl::anychar_p - (phrase_end | '[')))
- [actions.values.entry(ph::arg1, ph::arg2)]
- | qbk_since(106u)
- >> actions.to_value()
+ [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u)
+ >> to_value()
[ *( raw_escape
| (cl::anychar_p - (phrase_end | '['))
- [actions.raw_char]
+ [raw_char]
)
]
)
@@ -92,9 +97,9 @@ namespace quickbook
>> space
]
>> cl::eps_p(']')
- | qbk_before(105u)
+ | qbk_ver(0, 105u)
>> blank
- >> (*(cl::anychar_p - phrase_end)) [actions.values.entry(ph::arg1, ph::arg2)]
+ >> (*(cl::anychar_p - phrase_end)) [state.values.entry(ph::arg1, ph::arg2)]
>> cl::eps_p(']')
;
@@ -113,16 +118,21 @@ namespace quickbook
local.link =
space
- >> ( qbk_before(106u)
+ >> ( qbk_ver(0, 106u)
>> (*(cl::anychar_p - (']' | space)))
- [actions.values.entry(ph::arg1, ph::arg2)]
- | qbk_since(106u)
- >> actions.to_value()
+ [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u, 107u)
+ >> to_value()
[ *( raw_escape
- | (cl::anychar_p - (']' | space))
- [actions.raw_char]
+ | (cl::anychar_p - (cl::ch_p('[') | ']' | space))
+ [raw_char]
)
]
+ >> !( ~cl::eps_p(comment)
+ >> cl::eps_p('[') [error("Open bracket in link value.")]
+ )
+ | qbk_ver(107u)
+ >> to_value() [attribute_value_1_7]
)
>> hard_space
>> local.inner_phrase
@@ -134,13 +144,13 @@ namespace quickbook
local.anchor =
blank
- >> ( qbk_before(106u)
- >> (*(cl::anychar_p - phrase_end)) [actions.values.entry(ph::arg1, ph::arg2)]
- | qbk_since(106u)
- >> actions.to_value()
+ >> ( qbk_ver(0, 106u)
+ >> (*(cl::anychar_p - phrase_end)) [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u)
+ >> to_value()
[ *( raw_escape
| (cl::anychar_p - phrase_end)
- [actions.raw_char]
+ [raw_char]
)
]
)
@@ -157,6 +167,15 @@ namespace quickbook
("footnote", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::footnote))
;
+ elements.add("!", element_info(element_info::maybe_block, &local.source_mode, code_tags::next_source_mode, 107u))
+ ;
+
+ local.source_mode =
+ ( cl::str_p("c++")
+ | "python"
+ | "teletype"
+ ) [state.values.entry(ph::arg1, ph::arg2)];
+
elements.add
("c++", element_info(element_info::phrase, &local.empty, source_mode_tags::cpp))
("python", element_info(element_info::phrase, &local.empty, source_mode_tags::python))
@@ -169,7 +188,7 @@ namespace quickbook
local.role
= space
- >> (+(cl::alnum_p | '_')) [actions.values.entry(ph::arg1, ph::arg2)]
+ >> (+(cl::alnum_p | '_')) [state.values.entry(ph::arg1, ph::arg2)]
>> hard_space
>> local.inner_phrase
;
@@ -178,7 +197,7 @@ namespace quickbook
local.inner_phrase =
blank
- >> actions.to_value() [ paragraph_phrase ]
+ >> to_value() [ paragraph_phrase ]
;
}
}