blob: 0e7791dc0c07b301af7547070fb65c097bfa9d33 [file] [log] [blame]
/*=============================================================================
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_DOC_INFO_HPP)
#define BOOST_SPIRIT_QUICKBOOK_DOC_INFO_HPP
#include "./phrase.hpp"
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_actor.hpp>
#include <boost/spirit/include/classic_loops.hpp>
#include <boost/spirit/include/classic_symbols.hpp>
namespace quickbook
{
using namespace boost::spirit::classic;
extern unsigned qbk_major_version;
extern unsigned qbk_minor_version;
template <typename Actions>
struct doc_info_grammar
: public grammar<doc_info_grammar<Actions> >
{
doc_info_grammar(Actions& actions)
: actions(actions) {}
template <typename Scanner>
struct definition
{
typedef uint_parser<int, 10, 1, 2> uint2_t;
definition(doc_info_grammar const& self)
: unused(false), common(self.actions, unused)
{
Actions& actions = self.actions;
doc_types =
"book", "article", "library", "chapter", "part"
, "appendix", "preface", "qandadiv", "qandaset"
, "reference", "set"
;
doc_info =
space
>> '[' >> space
>> (doc_types >> eps_p) [assign_a(actions.doc_type)]
>> hard_space
>> ( *(anychar_p -
(ch_p('[') | ']' | eol_p)
)
) [assign_a(actions.doc_title)]
>> !(
space >> '[' >>
quickbook_version
>> space >> ']'
)
>>
*(
space >> '[' >>
(
doc_version
| doc_id
| doc_dirname
| doc_copyright [push_back_a(actions.doc_copyrights, copyright)]
| doc_purpose [actions.extract_doc_purpose]
| doc_category
| doc_authors
| doc_license [actions.extract_doc_license]
| doc_last_revision
| doc_source_mode
)
>> space >> ']' >> +eol_p
)
>> space >> ']' >> +eol_p
;
quickbook_version =
"quickbook" >> hard_space
>> ( uint_p [assign_a(qbk_major_version)]
>> '.'
>> uint2_t() [assign_a(qbk_minor_version)]
)
;
doc_version =
"version" >> hard_space
>> (*(anychar_p - ']')) [assign_a(actions.doc_version)]
;
doc_id =
"id" >> hard_space
>> (*(anychar_p - ']')) [assign_a(actions.doc_id)]
;
doc_dirname =
"dirname" >> hard_space
>> (*(anychar_p - ']')) [assign_a(actions.doc_dirname)]
;
doc_copyright =
"copyright" >> hard_space [clear_a(copyright.first)]
>> +( repeat_p(4)[digit_p] [push_back_a(copyright.first)]
>> space
)
>> space
>> (*(anychar_p - ']')) [assign_a(copyright.second)]
;
doc_purpose =
"purpose" >> hard_space
>> phrase [assign_a(actions.doc_purpose_1_1)]
;
doc_category =
"category" >> hard_space
>> (*(anychar_p - ']')) [assign_a(actions.doc_category)]
;
doc_author =
space
>> '[' >> space
>> (*(anychar_p - ',')) [assign_a(name.second)] // surname
>> ',' >> space
>> (*(anychar_p - ']')) [assign_a(name.first)] // firstname
>> ']'
;
doc_authors =
"authors" >> hard_space
>> doc_author [push_back_a(actions.doc_authors, name)]
>> *( ','
>> doc_author [push_back_a(actions.doc_authors, name)]
)
;
doc_license =
"license" >> hard_space
>> phrase [assign_a(actions.doc_license_1_1)]
;
doc_last_revision =
"last-revision" >> hard_space
>> (*(anychar_p - ']')) [assign_a(actions.doc_last_revision)]
;
doc_source_mode =
"source-mode" >> hard_space
>> (
str_p("c++")
| "python"
| "teletype"
) [assign_a(actions.source_mode)]
;
comment =
"[/" >> *(anychar_p - ']') >> ']'
;
space =
*(space_p | comment)
;
hard_space =
(eps_p - (alnum_p | '_')) >> space // must not be preceded by
; // alpha-numeric or underscore
phrase =
*( common
| comment
| (anychar_p - ']') [actions.plain_char]
)
;
}
bool unused;
std::pair<std::string, std::string> name;
std::pair<std::vector<std::string>, std::string> copyright;
rule<Scanner> doc_info, doc_title, doc_version, doc_id, doc_dirname,
doc_copyright, doc_purpose,doc_category, doc_authors,
doc_author, comment, space, hard_space, doc_license,
doc_last_revision, doc_source_mode, phrase, quickbook_version;
phrase_grammar<Actions> common;
symbols<> doc_types;
rule<Scanner> const&
start() const { return doc_info; }
};
Actions& actions;
};
}
#endif // BOOST_SPIRIT_QUICKBOOK_DOC_INFO_HPP