34 #include <GG/adobe/istream.hpp>
35 #include <GG/adobe/implementation/token.hpp>
41 struct named_eq_op : adobe::name_t {};
42 struct named_rel_op : adobe::name_t {};
43 struct named_mul_op : adobe::name_t {};
47 boost::spirit::lex::lexer<spirit_lexer_base_type>
49 lexer(
const adobe::name_t* first_keyword,
50 const adobe::name_t* last_keyword);
52 boost::spirit::lex::token_def<bool> keyword_true_false;
53 boost::spirit::lex::token_def<boost::spirit::lex::omit> keyword_empty;
54 boost::spirit::lex::token_def<adobe::name_t> identifier;
55 boost::spirit::lex::token_def<std::string> lead_comment;
56 boost::spirit::lex::token_def<std::string> trail_comment;
57 boost::spirit::lex::token_def<std::string> quoted_string;
58 boost::spirit::lex::token_def<double> number;
59 boost::spirit::lex::token_def<detail::named_eq_op> eq_op;
60 boost::spirit::lex::token_def<detail::named_rel_op> rel_op;
61 boost::spirit::lex::token_def<detail::named_mul_op> mul_op;
62 boost::spirit::lex::token_def<boost::spirit::lex::omit> define;
63 boost::spirit::lex::token_def<boost::spirit::lex::omit> or_;
64 boost::spirit::lex::token_def<boost::spirit::lex::omit> and_;
65 std::map<adobe::name_t, boost::spirit::lex::token_def<adobe::name_t> > keywords;
68 typedef lexer::iterator_type token_iterator;
70 typedef lexer::lexer_def lexer_def;
72 typedef boost::spirit::qi::in_state_skipper<lexer_def> skipper_type;
74 extern const boost::phoenix::function<report_error_<token_type> > report_error;
82 namespace GG {
namespace detail {
83 BOOST_SPIRIT_TERMINAL(next_pos);
86 namespace boost {
namespace spirit {
88 struct use_terminal<qi::domain, GG::detail::tag::next_pos> :
93 namespace GG {
namespace detail {
94 struct next_pos_parser :
95 boost::spirit::qi::primitive_parser<next_pos_parser>
97 template <
typename Context,
typename Iter>
99 {
typedef adobe::line_position_t type; };
101 template <
typename Iter,
typename Context,
typename Skipper,
typename Attribute>
102 bool parse(Iter& first, Iter
const& last, Context&, Skipper
const& skipper, Attribute& attr)
const
104 boost::spirit::qi::skip_over(first, last, skipper);
105 attr = adobe::line_position_t(detail::s_filename, boost::spirit::get_line(first->matched().begin()) - 1);
110 std::distance(detail::s_begin,
111 boost::spirit::get_line_start(detail::s_begin, first->matched().begin())) + 2;
113 std::distance(detail::s_begin, first->matched().begin()) + 1;
117 template <
typename Context>
118 boost::spirit::info what(Context&)
const
119 {
return boost::spirit::info(
"next_pos"); }
123 namespace boost {
namespace spirit {
namespace qi {
124 template <
typename Modifiers>
125 struct make_primitive<GG::detail::tag::next_pos, Modifiers>
127 typedef GG::detail::next_pos_parser result_type;
128 result_type operator()(unused_type, unused_type)
const
129 {
return result_type(); }
137 namespace boost {
namespace spirit {
namespace traits
142 template <
typename Iter>
143 struct assign_to_attribute_from_iterators<adobe::name_t, Iter>
145 static void call(
const Iter& first,
const Iter& last, adobe::name_t& attr)
146 { attr = adobe::name_t(std::string(first, last).c_str()); }
152 struct GG_API assign_to_attribute_from_iterators<bool, GG::text_iterator, void>
154 static void call(
const GG::text_iterator& first,
const GG::text_iterator& last,
bool& attr)
155 { attr = *first ==
't' ?
true :
false; }
158 template <
typename Iter>
159 struct assign_to_attribute_from_iterators<GG::detail::named_eq_op, Iter>
161 static void call(
const Iter& first,
const Iter& last, adobe::name_t& attr)
162 { attr = *first ==
'=' ? adobe::equal_k : adobe::not_equal_k; }
165 template <
typename Iter>
166 struct assign_to_attribute_from_iterators<GG::detail::named_rel_op, Iter>
168 static void call(
const Iter& first,
const Iter& last, adobe::name_t& attr)
170 std::ptrdiff_t dist = std::distance(first, last);
173 (dist == 1 ? adobe::less_k : adobe::less_equal_k) :
174 (dist == 1 ? adobe::greater_k : adobe::greater_equal_k);
178 template <
typename Iter>
179 struct assign_to_attribute_from_iterators<GG::detail::named_mul_op, Iter>
181 static void call(
const Iter& first,
const Iter& last, adobe::name_t& attr)
186 (*first ==
'/' ? adobe::divide_k : adobe::modulus_k);