forked from freeorion/freeorion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConditionParser4.cpp
116 lines (102 loc) · 3.91 KB
/
ConditionParser4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "ConditionParser4.h"
#include "../universe/Conditions.h"
#include "../universe/ValueRef.h"
#include <boost/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
#if DEBUG_CONDITION_PARSERS
namespace std {
inline ostream& operator<<(ostream& os, const std::vector<condition_payload>&) { return os; }
}
#endif
namespace parse { namespace detail {
condition_parser_rules_4::condition_parser_rules_4(
const parse::lexer& tok,
Labeller& label,
const condition_parser_grammar& condition_parser,
const value_ref_grammar<std::string>& string_grammar
) :
condition_parser_rules_4::base_type(start, "condition_parser_rules_4"),
int_rules(tok, label, condition_parser, string_grammar),
double_rules(tok, label, condition_parser, string_grammar),
non_ship_part_meter_type_enum(tok),
ship_part_meter_type_enum(tok)
{
qi::_1_type _1;
qi::_2_type _2;
qi::_3_type _3;
qi::_4_type _4;
qi::_val_type _val;
qi::eps_type eps;
qi::_pass_type _pass;
qi::omit_type omit_;
const boost::phoenix::function<construct_movable> construct_movable_;
const boost::phoenix::function<deconstruct_movable> deconstruct_movable_;
using phoenix::new_;
using phoenix::construct;
meter_value
= (
non_ship_part_meter_type_enum
> -(label(tok.low_) > double_rules.expr)
> -(label(tok.high_) > double_rules.expr)
) [ _val = construct_movable_(new_<Condition::MeterValue>(
_1,
deconstruct_movable_(_2, _pass),
deconstruct_movable_(_3, _pass))) ]
;
ship_part_meter_value
= (
omit_[tok.ShipPartMeter_]
> label(tok.part_) > string_grammar
> label(tok.meter_) > ship_part_meter_type_enum
> -(label(tok.low_) > double_rules.expr)
> -(label(tok.high_) > double_rules.expr)
) [ _val = construct_movable_(new_<Condition::ShipPartMeterValue>(
deconstruct_movable_(_1, _pass),
_2,
deconstruct_movable_(_3, _pass),
deconstruct_movable_(_4, _pass))) ]
;
empire_meter_value1
= (
(omit_[tok.EmpireMeter_]
>> label(tok.empire_)) > int_rules.expr
> label(tok.meter_) > tok.string
> -(label(tok.low_) > double_rules.expr)
> -(label(tok.high_) > double_rules.expr)
) [ _val = construct_movable_(new_<Condition::EmpireMeterValue>(
deconstruct_movable_(_1, _pass),
_2,
deconstruct_movable_(_3, _pass),
deconstruct_movable_(_4, _pass))) ]
;
empire_meter_value2
= (
(omit_[tok.EmpireMeter_]
>> label(tok.meter_)) > tok.string
> -(label(tok.low_) > double_rules.expr)
> -(label(tok.high_) > double_rules.expr)
) [ _val = construct_movable_(new_<Condition::EmpireMeterValue>(
_1,
deconstruct_movable_(_2, _pass),
deconstruct_movable_(_3, _pass))) ]
;
empire_meter_value
%= empire_meter_value1
| empire_meter_value2
;
start
%= meter_value
| ship_part_meter_value
| empire_meter_value
;
meter_value.name("MeterValue");
ship_part_meter_value.name("ShipPartMeterValue");
empire_meter_value.name("EmpireMeterValue");
#if DEBUG_CONDITION_PARSERS
debug(meter_value);
debug(ship_part_meter_value);
debug(empire_meter_value);
#endif
}
} }