59
77
template <typename FeatureT>
62
push_integer(stack<shared_ptr<expression<FeatureT> > >& exprs)
80
push_boolean(stack<shared_ptr<expression<FeatureT> > >& exprs)
65
void operator() (int val) const
83
void operator() (std::string const& val) const
86
exprs_.push(shared_ptr<expression<FeatureT> >
87
( new literal<FeatureT>(true)));
88
else if (val == "false")
89
exprs_.push(shared_ptr<expression<FeatureT> >
90
( new literal<FeatureT>(false)));
92
stack<shared_ptr<expression<FeatureT> > >& exprs_;
95
template <typename FeatureT>
98
push_integer(stack<shared_ptr<expression<FeatureT> > >& exprs)
101
void operator() (int val) const
67
103
exprs_.push(shared_ptr<expression<FeatureT> >
68
104
( new literal<FeatureT>(val)));
70
stack<shared_ptr<expression<FeatureT> > >& exprs_;
106
stack<shared_ptr<expression<FeatureT> > >& exprs_;
73
template <typename FeatureT>
76
push_real(stack<shared_ptr<expression<FeatureT> > >& exprs)
109
template <typename FeatureT>
112
push_real(stack<shared_ptr<expression<FeatureT> > >& exprs)
77
113
: exprs_(exprs) {}
78
void operator() (double val) const
114
void operator() (double val) const
80
116
exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(val)));
82
stack<shared_ptr<expression<FeatureT> > >& exprs_;
85
template <typename FeatureT>
88
push_string(stack<shared_ptr<expression<FeatureT> > >& exprs)
91
template <typename Iter>
92
void operator() (Iter start,Iter end) const
94
std::wstring str(start,end);
95
std::wstring quote = L"\\";
96
std::wstring::size_type idx;
97
idx = str.find(quote);
98
while (idx != string::npos)
101
idx = str.find(quote);
103
exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(str)));
105
stack<shared_ptr<expression<FeatureT> > >& exprs_;
108
template <typename FeatureT>
111
push_property(stack<shared_ptr<expression<FeatureT> > >& exprs)
114
template <typename Iter>
115
void operator() (Iter start,Iter end) const
118
stack<shared_ptr<expression<FeatureT> > >& exprs_;
121
template <typename FeatureT>
124
push_string(stack<shared_ptr<expression<FeatureT> > >& exprs, transcoder const& tr)
128
template <typename Iter>
129
void operator() (Iter start,Iter end) const
131
UnicodeString unicode = tr_.transcode(std::string(start,end).c_str());
132
exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(unicode)));
134
stack<shared_ptr<expression<FeatureT> > >& exprs_;
135
transcoder const& tr_;
138
template <typename FeatureT>
141
push_property(stack<shared_ptr<expression<FeatureT> > >& exprs)
144
template <typename Iter>
145
void operator() (Iter start,Iter end) const
117
147
string str(start,end);
118
148
exprs_.push(shared_ptr<expression<FeatureT> >(new property<FeatureT>(str)));
120
stack<shared_ptr<expression<FeatureT> > >& exprs_;
150
stack<shared_ptr<expression<FeatureT> > >& exprs_;
123
template <typename FeatureT,typename Op>
124
struct compose_expression
126
compose_expression(stack<shared_ptr<expression<FeatureT> > >& exprs)
153
template <typename FeatureT,typename Op>
154
struct compose_expression
156
compose_expression(stack<shared_ptr<expression<FeatureT> > >& exprs)
127
157
: exprs_(exprs) {}
129
template <typename Iter>
130
void operator() (Iter,Iter) const
159
template <typename Iter>
160
void operator() (Iter,Iter) const
132
162
if (exprs_.size()>=2)
134
shared_ptr<expression<FeatureT> > right = exprs_.top();
136
shared_ptr<expression<FeatureT> > left = exprs_.top();
140
exprs_.push(shared_ptr<expression<FeatureT> >
141
(new mapnik::math_expr_b<FeatureT,Op>(*left,*right)));
164
shared_ptr<expression<FeatureT> > right = exprs_.top();
166
shared_ptr<expression<FeatureT> > left = exprs_.top();
170
exprs_.push(shared_ptr<expression<FeatureT> >
171
(new mapnik::math_expr_b<FeatureT,Op>(*left,*right)));
145
stack<shared_ptr<expression<FeatureT> > >& exprs_;
175
stack<shared_ptr<expression<FeatureT> > >& exprs_;
148
template <typename FeatureT>
151
compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters,
152
stack<shared_ptr<expression<FeatureT> > >& exprs)
178
template <typename FeatureT>
181
compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters,
182
stack<shared_ptr<expression<FeatureT> > >& exprs)
153
183
: filters_(filters),exprs_(exprs) {}
155
template <typename Iter>
156
void operator() (Iter start,Iter end) const
185
template <typename Iter>
186
void operator() (Iter start,Iter end) const
158
188
if (exprs_.size()>=1)
160
shared_ptr<expression<FeatureT> > exp = exprs_.top();
164
std::string pattern(start,end);
167
filters_.push(shared_ptr<filter<FeatureT> >
168
(new regex_filter<FeatureT>(*exp,pattern)));
170
catch (...)//boost::regex_error& ex)
172
clog<<"error\n";//ex.what()<<"\n";
190
shared_ptr<expression<FeatureT> > exp = exprs_.top();
194
std::string pattern(start,end);
197
filters_.push(shared_ptr<filter<FeatureT> >
198
(new regex_filter<FeatureT>(*exp,pattern)));
200
catch (...)//boost::regex_error& ex)
202
clog<<"error\n";//ex.what()<<"\n";
178
stack<shared_ptr<filter<FeatureT> > >& filters_;
179
stack<shared_ptr<expression<FeatureT> > >& exprs_;
208
stack<shared_ptr<filter<FeatureT> > >& filters_;
209
stack<shared_ptr<expression<FeatureT> > >& exprs_;
183
template <typename FeatureT,typename Op>
184
struct compose_filter
186
compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters,
187
stack<shared_ptr<expression<FeatureT> > >& exprs)
213
template <typename FeatureT,typename Op>
214
struct compose_filter
216
compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters,
217
stack<shared_ptr<expression<FeatureT> > >& exprs)
188
218
: filters_(filters),exprs_(exprs) {}
190
template <typename Iter>
191
void operator() (Iter,Iter) const
220
template <typename Iter>
221
void operator() (Iter,Iter) const
193
223
if (exprs_.size()>=2)
195
shared_ptr<expression<FeatureT> > right = exprs_.top();
197
shared_ptr<expression<FeatureT> > left = exprs_.top();
201
filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right)));
205
stack<shared_ptr<filter<FeatureT> > >& filters_;
206
stack<shared_ptr<expression<FeatureT> > >& exprs_;
209
template <typename FeatureT>
210
struct compose_and_filter
212
compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
213
: filters_(filters) {}
215
template <typename Iter>
216
void operator() (Iter,Iter) const
218
if (filters_.size()>=2)
220
shared_ptr<filter<FeatureT> > right = filters_.top();
222
shared_ptr<filter<FeatureT> > left = filters_.top();
226
filters_.push(shared_ptr<filter<FeatureT> >
227
(new logical_and<FeatureT>(*left,*right)));
231
stack<shared_ptr<filter<FeatureT> > >& filters_;
234
template <typename FeatureT>
235
struct compose_or_filter
237
compose_or_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
238
: filters_(filters) {}
240
template <typename Iter>
241
void operator() (Iter,Iter) const
243
if (filters_.size()>=2)
245
shared_ptr<filter<FeatureT> > right = filters_.top();
247
shared_ptr<filter<FeatureT> > left = filters_.top();
251
filters_.push(shared_ptr<filter<FeatureT> >
252
(new logical_or<FeatureT>(*left,*right)));
256
stack<shared_ptr<filter<FeatureT> > >& filters_;
259
template <typename FeatureT>
260
struct compose_not_filter
262
compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
263
: filters_(filters) {}
265
template <typename Iter>
266
void operator() (Iter,Iter) const
225
shared_ptr<expression<FeatureT> > right = exprs_.top();
227
shared_ptr<expression<FeatureT> > left = exprs_.top();
231
filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right)));
235
stack<shared_ptr<filter<FeatureT> > >& filters_;
236
stack<shared_ptr<expression<FeatureT> > >& exprs_;
239
template <typename FeatureT>
240
struct compose_boolean_filter
242
compose_boolean_filter(stack<shared_ptr<filter<FeatureT> > >& filters,
243
stack<shared_ptr<expression<FeatureT> > >& exprs)
244
: filters_(filters),exprs_(exprs) {}
246
template <typename Iter>
247
void operator() (Iter,Iter) const
249
if (exprs_.size()>=1)
251
shared_ptr<expression<FeatureT> > exp = exprs_.top();
255
filters_.push(shared_ptr<filter<FeatureT> >(new boolean_filter<FeatureT>(*exp)));
259
stack<shared_ptr<filter<FeatureT> > >& filters_;
260
stack<shared_ptr<expression<FeatureT> > >& exprs_;
263
template <typename FeatureT>
264
struct compose_and_filter
266
compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
267
: filters_(filters) {}
269
template <typename Iter>
270
void operator() (Iter,Iter) const
272
if (filters_.size()>=2)
274
shared_ptr<filter<FeatureT> > right = filters_.top();
276
shared_ptr<filter<FeatureT> > left = filters_.top();
280
filters_.push(shared_ptr<filter<FeatureT> >
281
(new logical_and<FeatureT>(*left,*right)));
285
stack<shared_ptr<filter<FeatureT> > >& filters_;
288
template <typename FeatureT>
289
struct compose_or_filter
291
compose_or_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
292
: filters_(filters) {}
294
template <typename Iter>
295
void operator() (Iter,Iter) const
297
if (filters_.size()>=2)
299
shared_ptr<filter<FeatureT> > right = filters_.top();
301
shared_ptr<filter<FeatureT> > left = filters_.top();
305
filters_.push(shared_ptr<filter<FeatureT> >
306
(new logical_or<FeatureT>(*left,*right)));
310
stack<shared_ptr<filter<FeatureT> > >& filters_;
313
template <typename FeatureT>
314
struct compose_not_filter
316
compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
317
: filters_(filters) {}
319
template <typename Iter>
320
void operator() (Iter,Iter) const
268
322
if (filters_.size()>=1)
270
shared_ptr<filter<FeatureT> > filter_ = filters_.top();
274
filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_)));
324
shared_ptr<filter<FeatureT> > filter_ = filters_.top();
328
filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_)));
278
stack<shared_ptr<filter<FeatureT> > >& filters_;
332
stack<shared_ptr<filter<FeatureT> > >& filters_;
281
template <typename FeatureT>
282
struct filter_grammar : public grammar<filter_grammar<FeatureT> >
284
filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_,
285
stack<shared_ptr<expression<FeatureT> > >& exprs_)
286
: filters(filters_),exprs(exprs_) {}
288
template <typename ScannerT>
291
definition(filter_grammar const& self)
293
typedef boost::spirit::chset<wchar_t> chset_t;
295
func1_op = "sqrt","sin","cos";
296
func2_op = "min","max";
297
spatial_op = "Equals","Disjoint","Touches","Within","Overlaps",
298
"Crosses","Intersects","Contains","DWithin","Beyond","BBOX";
300
chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E"
301
L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217"
302
L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE"
303
L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F"
304
L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB"
305
L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA"
306
L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE"
307
L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C"
308
L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD"
309
L"\x9DF-\x9E1\x9F0-\x9F1\xA05-\xA0A\xA0F-\xA10\xA13-\xA28\xA2A-\xA30"
310
L"\xA32-\xA33\xA35-\xA36\xA38-\xA39\xA59-\xA5C\xA5E\xA72-\xA74"
311
L"\xA85-\xA8B\xA8D\xA8F-\xA91\xA93-\xAA8\xAAA-\xAB0\xAB2-\xAB3"
312
L"\xAB5-\xAB9\xABD\xAE0\xB05-\xB0C\xB0F-\xB10\xB13-\xB28\xB2A-\xB30"
313
L"\xB32-\xB33\xB36-\xB39\xB3D\xB5C-\xB5D\xB5F-\xB61\xB85-\xB8A"
314
L"\xB8E-\xB90\xB92-\xB95\xB99-\xB9A\xB9C\xB9E-\xB9F\xBA3-\xBA4"
315
L"\xBA8-\xBAA\xBAE-\xBB5\xBB7-\xBB9\xC05-\xC0C\xC0E-\xC10\xC12-\xC28"
316
L"\xC2A-\xC33\xC35-\xC39\xC60-\xC61\xC85-\xC8C\xC8E-\xC90\xC92-\xCA8"
317
L"\xCAA-\xCB3\xCB5-\xCB9\xCDE\xCE0-\xCE1\xD05-\xD0C\xD0E-\xD10"
318
L"\xD12-\xD28\xD2A-\xD39\xD60-\xD61\xE01-\xE2E\xE30\xE32-\xE33"
319
L"\xE40-\xE45\xE81-\xE82\xE84\xE87-\xE88\xE8A\xE8D\xE94-\xE97"
320
L"\xE99-\xE9F\xEA1-\xEA3\xEA5\xEA7\xEAA-\xEAB\xEAD-\xEAE\xEB0"
321
L"\xEB2-\xEB3\xEBD\xEC0-\xEC4\xF40-\xF47\xF49-\xF69\x10A0-\x10C5"
322
L"\x10D0-\x10F6\x1100\x1102-\x1103\x1105-\x1107\x1109\x110B-\x110C"
323
L"\x110E-\x1112\x113C\x113E\x1140\x114C\x114E\x1150\x1154-\x1155"
324
L"\x1159\x115F-\x1161\x1163\x1165\x1167\x1169\x116D-\x116E"
325
L"\x1172-\x1173\x1175\x119E\x11A8\x11AB\x11AE-\x11AF\x11B7-\x11B8"
326
L"\x11BA\x11BC-\x11C2\x11EB\x11F0\x11F9\x1E00-\x1E9B\x1EA0-\x1EF9"
327
L"\x1F00-\x1F15\x1F18-\x1F1D\x1F20-\x1F45\x1F48-\x1F4D\x1F50-\x1F57"
328
L"\x1F59\x1F5B\x1F5D\x1F5F-\x1F7D\x1F80-\x1FB4\x1FB6-\x1FBC\x1FBE"
329
L"\x1FC2-\x1FC4\x1FC6-\x1FCC\x1FD0-\x1FD3\x1FD6-\x1FDB\x1FE0-\x1FEC"
330
L"\x1FF2-\x1FF4\x1FF6-\x1FFC\x2126\x212A-\x212B\x212E\x2180-\x2182"
331
L"\x3041-\x3094\x30A1-\x30FA\x3105-\x312C\xAC00-\xD7A3");
335
template <typename FeatureT>
336
struct filter_grammar : public grammar<filter_grammar<FeatureT> >
338
filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_,
339
stack<shared_ptr<expression<FeatureT> > >& exprs_,
340
transcoder const& tr_)
345
template <typename ScannerT>
348
definition(filter_grammar const& self)
350
typedef boost::spirit::chset<wchar_t> chset_t;
352
func1_op = "sqrt","sin","cos";
353
func2_op = "min","max";
354
spatial_op = "Equals","Disjoint","Touches","Within","Overlaps",
355
"Crosses","Intersects","Contains","DWithin","Beyond","BBOX";
356
boolean_const = "true","false";
358
chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E"
359
L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217"
360
L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE"
361
L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F"
362
L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB"
363
L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA"
364
L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE"
365
L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C"
366
L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD"
367
L"\x9DF-\x9E1\x9F0-\x9F1\xA05-\xA0A\xA0F-\xA10\xA13-\xA28\xA2A-\xA30"
368
L"\xA32-\xA33\xA35-\xA36\xA38-\xA39\xA59-\xA5C\xA5E\xA72-\xA74"
369
L"\xA85-\xA8B\xA8D\xA8F-\xA91\xA93-\xAA8\xAAA-\xAB0\xAB2-\xAB3"
370
L"\xAB5-\xAB9\xABD\xAE0\xB05-\xB0C\xB0F-\xB10\xB13-\xB28\xB2A-\xB30"
371
L"\xB32-\xB33\xB36-\xB39\xB3D\xB5C-\xB5D\xB5F-\xB61\xB85-\xB8A"
372
L"\xB8E-\xB90\xB92-\xB95\xB99-\xB9A\xB9C\xB9E-\xB9F\xBA3-\xBA4"
373
L"\xBA8-\xBAA\xBAE-\xBB5\xBB7-\xBB9\xC05-\xC0C\xC0E-\xC10\xC12-\xC28"
374
L"\xC2A-\xC33\xC35-\xC39\xC60-\xC61\xC85-\xC8C\xC8E-\xC90\xC92-\xCA8"
375
L"\xCAA-\xCB3\xCB5-\xCB9\xCDE\xCE0-\xCE1\xD05-\xD0C\xD0E-\xD10"
376
L"\xD12-\xD28\xD2A-\xD39\xD60-\xD61\xE01-\xE2E\xE30\xE32-\xE33"
377
L"\xE40-\xE45\xE81-\xE82\xE84\xE87-\xE88\xE8A\xE8D\xE94-\xE97"
378
L"\xE99-\xE9F\xEA1-\xEA3\xEA5\xEA7\xEAA-\xEAB\xEAD-\xEAE\xEB0"
379
L"\xEB2-\xEB3\xEBD\xEC0-\xEC4\xF40-\xF47\xF49-\xF69\x10A0-\x10C5"
380
L"\x10D0-\x10F6\x1100\x1102-\x1103\x1105-\x1107\x1109\x110B-\x110C"
381
L"\x110E-\x1112\x113C\x113E\x1140\x114C\x114E\x1150\x1154-\x1155"
382
L"\x1159\x115F-\x1161\x1163\x1165\x1167\x1169\x116D-\x116E"
383
L"\x1172-\x1173\x1175\x119E\x11A8\x11AB\x11AE-\x11AF\x11B7-\x11B8"
384
L"\x11BA\x11BC-\x11C2\x11EB\x11F0\x11F9\x1E00-\x1E9B\x1EA0-\x1EF9"
385
L"\x1F00-\x1F15\x1F18-\x1F1D\x1F20-\x1F45\x1F48-\x1F4D\x1F50-\x1F57"
386
L"\x1F59\x1F5B\x1F5D\x1F5F-\x1F7D\x1F80-\x1FB4\x1FB6-\x1FBC\x1FBE"
387
L"\x1FC2-\x1FC4\x1FC6-\x1FCC\x1FD0-\x1FD3\x1FD6-\x1FDB\x1FE0-\x1FEC"
388
L"\x1FF2-\x1FF4\x1FF6-\x1FFC\x2126\x212A-\x212B\x212E\x2180-\x2182"
389
L"\x3041-\x3094\x30A1-\x30FA\x3105-\x312C\xAC00-\xD7A3");
333
chset_t Ideographic(L"\x4E00-\x9FA5\x3007\x3021-\x3029");
334
chset_t Letter = BaseChar | Ideographic;
336
chset_t CombiningChar(L"\x0300-\x0345\x0360-\x0361\x0483-\x0486\x0591-\x05A1\x05A3-\x05B9"
337
L"\x05BB-\x05BD\x05BF\x05C1-\x05C2\x05C4\x064B-\x0652\x0670"
338
L"\x06D6-\x06DC\x06DD-\x06DF\x06E0-\x06E4\x06E7-\x06E8\x06EA-\x06ED"
339
L"\x0901-\x0903\x093C\x093E-\x094C\x094D\x0951-\x0954\x0962-\x0963"
340
L"\x0981-\x0983\x09BC\x09BE\x09BF\x09C0-\x09C4\x09C7-\x09C8"
341
L"\x09CB-\x09CD\x09D7\x09E2-\x09E3\x0A02\x0A3C\x0A3E\x0A3F"
342
L"\x0A40-\x0A42\x0A47-\x0A48\x0A4B-\x0A4D\x0A70-\x0A71\x0A81-\x0A83"
343
L"\x0ABC\x0ABE-\x0AC5\x0AC7-\x0AC9\x0ACB-\x0ACD\x0B01-\x0B03\x0B3C"
344
L"\x0B3E-\x0B43\x0B47-\x0B48\x0B4B-\x0B4D\x0B56-\x0B57\x0B82-\x0B83"
345
L"\x0BBE-\x0BC2\x0BC6-\x0BC8\x0BCA-\x0BCD\x0BD7\x0C01-\x0C03"
346
L"\x0C3E-\x0C44\x0C46-\x0C48\x0C4A-\x0C4D\x0C55-\x0C56\x0C82-\x0C83"
347
L"\x0CBE-\x0CC4\x0CC6-\x0CC8\x0CCA-\x0CCD\x0CD5-\x0CD6\x0D02-\x0D03"
348
L"\x0D3E-\x0D43\x0D46-\x0D48\x0D4A-\x0D4D\x0D57\x0E31\x0E34-\x0E3A"
349
L"\x0E47-\x0E4E\x0EB1\x0EB4-\x0EB9\x0EBB-\x0EBC\x0EC8-\x0ECD"
350
L"\x0F18-\x0F19\x0F35\x0F37\x0F39\x0F3E\x0F3F\x0F71-\x0F84"
351
L"\x0F86-\x0F8B\x0F90-\x0F95\x0F97\x0F99-\x0FAD\x0FB1-\x0FB7\x0FB9"
352
L"\x20D0-\x20DC\x20E1\x302A-\x302F\x3099\x309A");
354
chset_t Digit(L"\x0030-\x0039\x0660-\x0669\x06F0-\x06F9\x0966-\x096F\x09E6-\x09EF"
355
L"\x0A66-\x0A6F\x0AE6-\x0AEF\x0B66-\x0B6F\x0BE7-\x0BEF\x0C66-\x0C6F"
356
L"\x0CE6-\x0CEF\x0D66-\x0D6F\x0E50-\x0E59\x0ED0-\x0ED9\x0F20-\x0F29");
358
chset_t Extender(L"\x00B7\x02D0\x02D1\x0387\x0640\x0E46\x0EC6\x3005\x3031-\x3035"
359
L"\x309D-\x309E\x30FC-\x30FE");
371
number = strict_real_p [push_real<FeatureT>(self.exprs)]
372
| int_p [push_integer<FeatureT>(self.exprs)];
374
string_ = confix_p(L'\'',(*lex_escape_ch_p)
375
[push_string<FeatureT>(self.exprs)],
378
property = L'[' >> ( (Letter | L'_' | L':')
379
>> *NameChar )[push_property<FeatureT>(self.exprs)] >> L']';
381
literal = number | string_ | property;
383
function = literal | ( func1_op >> L'('>> literal >> L')') |
384
(func2_op >> L'(' >> literal >> L','>> literal >> L')');
387
| L'(' >> or_expr >> L')'
391
>> *((L'*' >> factor) [compose_expression<FeatureT,mapnik::mult<value> >(self.exprs)]
392
| (L'/' >> factor) [compose_expression<FeatureT,mapnik::div<value> >(self.exprs)]);
394
expression = term >> *((L'+' >> term) [compose_expression<FeatureT,mapnik::add<value> >(self.exprs)]
395
| (L'-' >> term) [compose_expression<FeatureT,mapnik::sub<value> >(self.exprs)]);
397
regex = str_p(L".match")>>L'('>>confix_p(L'\'',(*lex_escape_ch_p)
398
[compose_regex<FeatureT>(self.filters,self.exprs)],
401
relation = expression
402
>> *((L">=" >> expression)
403
[compose_filter<FeatureT,greater_than_or_equal<value> >(self.filters,self.exprs)]
404
| (L'>' >> expression)
405
[compose_filter<FeatureT,mapnik::greater_than<value> >(self.filters,self.exprs)]
406
| (L'<' >> expression)
407
[compose_filter<FeatureT,mapnik::less_than<value> >(self.filters,self.exprs)]
408
| (L"<=" >> expression)
409
[compose_filter<FeatureT,less_than_or_equal<value> >(self.filters,self.exprs)]
412
equation = relation >> *( ( L'=' >> relation)
413
[compose_filter<FeatureT,mapnik::equals<value> >(self.filters,self.exprs)]
414
| ( L"<>" >> relation)
415
[compose_filter<FeatureT,not_equals<value> >(self.filters,self.exprs)]);
417
not_expr = equation | *(str_p(L"not") >> equation)[compose_not_filter<FeatureT>(self.filters)];
419
and_expr = not_expr >> *(L"and" >> not_expr)[compose_and_filter<FeatureT>(self.filters)];
421
or_expr = and_expr >> *(L"or" >> and_expr)[compose_or_filter<FeatureT>(self.filters)];
423
filter_statement = or_expr >> *(space_p) >> end_p;
391
chset_t Ideographic(L"\x4E00-\x9FA5\x3007\x3021-\x3029");
392
chset_t Letter = BaseChar | Ideographic;
394
chset_t CombiningChar(L"\x0300-\x0345\x0360-\x0361\x0483-\x0486\x0591-\x05A1\x05A3-\x05B9"
395
L"\x05BB-\x05BD\x05BF\x05C1-\x05C2\x05C4\x064B-\x0652\x0670"
396
L"\x06D6-\x06DC\x06DD-\x06DF\x06E0-\x06E4\x06E7-\x06E8\x06EA-\x06ED"
397
L"\x0901-\x0903\x093C\x093E-\x094C\x094D\x0951-\x0954\x0962-\x0963"
398
L"\x0981-\x0983\x09BC\x09BE\x09BF\x09C0-\x09C4\x09C7-\x09C8"
399
L"\x09CB-\x09CD\x09D7\x09E2-\x09E3\x0A02\x0A3C\x0A3E\x0A3F"
400
L"\x0A40-\x0A42\x0A47-\x0A48\x0A4B-\x0A4D\x0A70-\x0A71\x0A81-\x0A83"
401
L"\x0ABC\x0ABE-\x0AC5\x0AC7-\x0AC9\x0ACB-\x0ACD\x0B01-\x0B03\x0B3C"
402
L"\x0B3E-\x0B43\x0B47-\x0B48\x0B4B-\x0B4D\x0B56-\x0B57\x0B82-\x0B83"
403
L"\x0BBE-\x0BC2\x0BC6-\x0BC8\x0BCA-\x0BCD\x0BD7\x0C01-\x0C03"
404
L"\x0C3E-\x0C44\x0C46-\x0C48\x0C4A-\x0C4D\x0C55-\x0C56\x0C82-\x0C83"
405
L"\x0CBE-\x0CC4\x0CC6-\x0CC8\x0CCA-\x0CCD\x0CD5-\x0CD6\x0D02-\x0D03"
406
L"\x0D3E-\x0D43\x0D46-\x0D48\x0D4A-\x0D4D\x0D57\x0E31\x0E34-\x0E3A"
407
L"\x0E47-\x0E4E\x0EB1\x0EB4-\x0EB9\x0EBB-\x0EBC\x0EC8-\x0ECD"
408
L"\x0F18-\x0F19\x0F35\x0F37\x0F39\x0F3E\x0F3F\x0F71-\x0F84"
409
L"\x0F86-\x0F8B\x0F90-\x0F95\x0F97\x0F99-\x0FAD\x0FB1-\x0FB7\x0FB9"
410
L"\x20D0-\x20DC\x20E1\x302A-\x302F\x3099\x309A");
412
chset_t Digit(L"\x0030-\x0039\x0660-\x0669\x06F0-\x06F9\x0966-\x096F\x09E6-\x09EF"
413
L"\x0A66-\x0A6F\x0AE6-\x0AEF\x0B66-\x0B6F\x0BE7-\x0BEF\x0C66-\x0C6F"
414
L"\x0CE6-\x0CEF\x0D66-\x0D6F\x0E50-\x0E59\x0ED0-\x0ED9\x0F20-\x0F29");
416
chset_t Extender(L"\x00B7\x02D0\x02D1\x0387\x0640\x0E46\x0EC6\x3005\x3031-\x3035"
417
L"\x309D-\x309E\x30FC-\x30FE");
429
boolean = boolean_const [push_boolean<FeatureT>(self.exprs)];
431
number = strict_real_p [push_real<FeatureT>(self.exprs)]
432
| int_p [push_integer<FeatureT>(self.exprs)];
434
string_ = confix_p(L'\'',(*lex_escape_ch_p)
435
[push_string<FeatureT>(self.exprs,self.tr)],
438
property = L'[' >> ( (Letter | Digit | L'_' | L':')
439
>> *NameChar )[push_property<FeatureT>(self.exprs)] >> L']';
441
literal = boolean | number | string_ | property;
443
function = literal | ( func1_op >> L'('>> literal >> L')') |
444
(func2_op >> L'(' >> literal >> L','>> literal >> L')');
447
| L'(' >> or_expr >> L')'
451
>> *((L'*' >> factor) [compose_expression<FeatureT,mapnik::mult<value> >(self.exprs)]
452
| (L'/' >> factor) [compose_expression<FeatureT,mapnik::div<value> >(self.exprs)]
453
| (L'%' >> factor) [compose_expression<FeatureT,mapnik::mod<value> >(self.exprs)]);
455
expression = term >> *((L'+' >> term) [compose_expression<FeatureT,mapnik::add<value> >(self.exprs)]
456
| (L'-' >> term) [compose_expression<FeatureT,mapnik::sub<value> >(self.exprs)]);
458
regex = str_p(L".match")>>L'('>>confix_p(L'\'',(*lex_escape_ch_p)
459
[compose_regex<FeatureT>(self.filters,self.exprs)],
462
relation = expression
463
>> *((L">=" >> expression)
464
[compose_filter<FeatureT,greater_than_or_equal<value> >(self.filters,self.exprs)]
465
| (L'>' >> expression)
466
[compose_filter<FeatureT,mapnik::greater_than<value> >(self.filters,self.exprs)]
467
| (L'<' >> expression)
468
[compose_filter<FeatureT,mapnik::less_than<value> >(self.filters,self.exprs)]
469
| (L"<=" >> expression)
470
[compose_filter<FeatureT,less_than_or_equal<value> >(self.filters,self.exprs)]
473
equation = relation >> *( ( L'=' >> relation)
474
[compose_filter<FeatureT,mapnik::equals<value> >(self.filters,self.exprs)]
475
| ( L"<>" >> relation)
476
[compose_filter<FeatureT,not_equals<value> >(self.filters,self.exprs)]);
478
cond_expr = equation | (expression)[compose_boolean_filter<FeatureT>(self.filters,self.exprs)];
480
not_expr = cond_expr | *(str_p(L"not") >> cond_expr)[compose_not_filter<FeatureT>(self.filters)];
482
and_expr = not_expr >> *(L"and" >> not_expr)[compose_and_filter<FeatureT>(self.filters)];
484
or_expr = and_expr >> *(L"or" >> and_expr)[compose_or_filter<FeatureT>(self.filters)];
486
filter_statement = or_expr >> *(space_p) >> end_p;
425
488
#ifdef BOOST_SPIRIT_DEBUG
426
BOOST_SPIRIT_DEBUG_RULE( factor );
427
BOOST_SPIRIT_DEBUG_RULE( term );
428
BOOST_SPIRIT_DEBUG_RULE( expression );
429
BOOST_SPIRIT_DEBUG_RULE( relation );
430
BOOST_SPIRIT_DEBUG_RULE( equation );
431
BOOST_SPIRIT_DEBUG_RULE( not_expr );
432
BOOST_SPIRIT_DEBUG_RULE( and_expr );
433
BOOST_SPIRIT_DEBUG_RULE( or_expr );
489
BOOST_SPIRIT_DEBUG_RULE( factor );
490
BOOST_SPIRIT_DEBUG_RULE( term );
491
BOOST_SPIRIT_DEBUG_RULE( expression );
492
BOOST_SPIRIT_DEBUG_RULE( relation );
493
BOOST_SPIRIT_DEBUG_RULE( equation );
494
BOOST_SPIRIT_DEBUG_RULE( cond_expr );
495
BOOST_SPIRIT_DEBUG_RULE( not_expr );
496
BOOST_SPIRIT_DEBUG_RULE( and_expr );
497
BOOST_SPIRIT_DEBUG_RULE( or_expr );
435
BOOST_SPIRIT_DEBUG_RULE( filter_statement );
436
BOOST_SPIRIT_DEBUG_RULE( literal );
437
BOOST_SPIRIT_DEBUG_RULE( number );
438
BOOST_SPIRIT_DEBUG_RULE( string_ );
439
BOOST_SPIRIT_DEBUG_RULE( property );
440
BOOST_SPIRIT_DEBUG_RULE( function );
441
BOOST_SPIRIT_DEBUG_RULE( regex );
499
BOOST_SPIRIT_DEBUG_RULE( filter_statement );
500
BOOST_SPIRIT_DEBUG_RULE( literal );
501
BOOST_SPIRIT_DEBUG_RULE( boolean );
502
BOOST_SPIRIT_DEBUG_RULE( number );
503
BOOST_SPIRIT_DEBUG_RULE( string_ );
504
BOOST_SPIRIT_DEBUG_RULE( property );
505
BOOST_SPIRIT_DEBUG_RULE( function );
506
BOOST_SPIRIT_DEBUG_RULE( regex );
445
boost::spirit::rule<ScannerT> const& start() const
447
return filter_statement;
510
boost::spirit::rule<ScannerT> const& start() const
512
return filter_statement;
450
boost::spirit::rule<ScannerT> factor;
451
boost::spirit::rule<ScannerT> term;
452
boost::spirit::rule<ScannerT> expression;
453
boost::spirit::rule<ScannerT> relation;
454
boost::spirit::rule<ScannerT> equation;
455
boost::spirit::rule<ScannerT> not_expr;
456
boost::spirit::rule<ScannerT> and_expr;
457
boost::spirit::rule<ScannerT> or_expr;
459
boost::spirit::rule<ScannerT> filter_statement;
460
boost::spirit::rule<ScannerT> literal;
461
boost::spirit::rule<ScannerT> number;
462
boost::spirit::rule<ScannerT> string_;
463
boost::spirit::rule<ScannerT> property;
464
boost::spirit::rule<ScannerT> function;
465
boost::spirit::rule<ScannerT> regex;
466
symbols<string> func1_op;
467
symbols<string> func2_op;
468
symbols<string> spatial_op;
472
stack<shared_ptr<filter<FeatureT> > >& filters;
473
stack<shared_ptr<expression<FeatureT> > >& exprs;
515
boost::spirit::rule<ScannerT> factor;
516
boost::spirit::rule<ScannerT> term;
517
boost::spirit::rule<ScannerT> expression;
518
boost::spirit::rule<ScannerT> relation;
519
boost::spirit::rule<ScannerT> equation;
520
boost::spirit::rule<ScannerT> cond_expr;
521
boost::spirit::rule<ScannerT> not_expr;
522
boost::spirit::rule<ScannerT> and_expr;
523
boost::spirit::rule<ScannerT> or_expr;
525
boost::spirit::rule<ScannerT> filter_statement;
526
boost::spirit::rule<ScannerT> literal;
527
boost::spirit::rule<ScannerT> boolean;
528
boost::spirit::rule<ScannerT> number;
529
boost::spirit::rule<ScannerT> string_;
530
boost::spirit::rule<ScannerT> property;
531
boost::spirit::rule<ScannerT> function;
532
boost::spirit::rule<ScannerT> regex;
533
symbols<string> func1_op;
534
symbols<string> func2_op;
535
symbols<string> spatial_op;
536
symbols<string> boolean_const;
540
stack<shared_ptr<filter<FeatureT> > >& filters;
541
stack<shared_ptr<expression<FeatureT> > >& exprs;
542
transcoder const& tr;
477
546
#endif //FILTER_PARSER_HPP