Changeset 659 for trunk

Show
Ignore:
Timestamp:
02/26/08 06:43:49 (9 months ago)
Author:
artem
Message:

use range based 'parse' method
transcode strings in filter expressions (default to utf8 input)

-- we can use map definition *.xml to define encoding
-- and in case of Python from

# -*- coding: utf-8 -*-


utf8 encoded filters are working now.

Location:
trunk
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/bindings/python/mapnik_filter.cpp

    r313 r659  
    3737using mapnik::create_filter; 
    3838 
     39filter_ptr create_filter_(std::string const& wkt) 
     40{ 
     41   return create_filter(wkt,"utf8"); 
     42} 
     43 
    3944void export_filter() 
    4045{ 
     
    4348                                               "An expression which allows " 
    4449                                               "to select features.",no_init) 
    45         .def("__str__",&filter<Feature>::to_string); 
    46         ; 
     50       .def("__str__",&filter<Feature>::to_string); 
     51    ; 
    4752     
    48     def("Filter",&create_filter); 
     53    def("Filter",&create_filter_); 
    4954} 
  • trunk/include/mapnik/filter_factory.hpp

    r540 r659  
    2828#include <mapnik/config_error.hpp> 
    2929#include <mapnik/filter_parser.hpp> 
     30#include <mapnik/unicode.hpp> 
    3031 
    3132namespace mapnik 
     
    3738    { 
    3839    public: 
    39         static filter_ptr compile(string const& str) 
    40         { 
    41             stack<shared_ptr<filter<FeatureT> > > filters; 
    42             stack<shared_ptr<expression<FeatureT> > > exps; 
    43             filter_grammar<FeatureT> grammar(filters,exps); 
    44             char const *text = str.c_str(); 
    45             parse_info<> info = parse(text, grammar, space_p); 
    46             if ( ! info.full) { 
    47                 std::ostringstream os; 
    48                 os << "Failed to parse filter expression:" << std::endl 
    49                    << str << std::endl 
    50                    << "Parsing aborted at '" << info.stop << "'"; 
    51  
    52                 throw config_error( os.str() ); 
    53             } 
    54  
    55             if ( ! filters.empty()) 
    56             { 
    57                 return filters.top();    
    58             } 
    59             else  
    60             { 
    61                 // XXX: do we ever get here? [DS] 
    62                 return filter_ptr(new none_filter<FeatureT>()); 
    63             }   
    64         } 
     40       static filter_ptr compile(string const& str,transcoder const& tr) 
     41       { 
     42          stack<shared_ptr<filter<FeatureT> > > filters; 
     43          stack<shared_ptr<expression<FeatureT> > > exps; 
     44          filter_grammar<FeatureT> grammar(filters,exps,tr); 
     45          parse_info<std::string::const_iterator> info = parse(str.begin(), str.end(), grammar, space_p); 
     46          if ( !info.full)  
     47          { 
     48             std::ostringstream os; 
     49             os << "Failed to parse filter expression:\n" 
     50                << str <<  "\nParsing aborted at '" << *info.stop << "'"; 
     51              
     52             throw config_error( os.str() ); 
     53          } 
     54           
     55          if ( ! filters.empty()) 
     56          { 
     57             return filters.top();       
     58          } 
     59          else  
     60          { 
     61             // XXX: do we ever get here? [DS] 
     62             return filter_ptr(new none_filter<FeatureT>()); 
     63          }   
     64       } 
    6565    }; 
    66      
    67     MAPNIK_DECL filter_ptr create_filter (std::string const& wkt); 
     66    
     67   MAPNIK_DECL filter_ptr create_filter (std::string const& wkt, std::string const& encoding); 
     68   MAPNIK_DECL filter_ptr create_filter (std::string const& wkt); 
     69    
    6870} 
    6971 
  • trunk/include/mapnik/filter_parser.hpp

    r650 r659  
    2828// mapnik 
    2929#include <mapnik/value.hpp> 
     30#include <mapnik/unicode.hpp> 
    3031#include <mapnik/comparison.hpp> 
    3132#include <mapnik/math_expr.hpp> 
     
    3637 
    3738// boost 
    38 //#define BOOST_SPIRIT_DEBUG 
     39#ifdef MAPNIK_DEBUG 
     40#define BOOST_SPIRIT_DEBUG 
     41#endif 
     42 
    3943#include <boost/shared_ptr.hpp> 
    4044#include <boost/spirit/core.hpp> 
     
    5357namespace mapnik 
    5458{     
    55     using std::string; 
    56     using std::clog; 
    57     using std::stack; 
    58  
    59     template <typename FeatureT> 
    60     struct push_integer 
    61     { 
    62         push_integer(stack<shared_ptr<expression<FeatureT> > >& exprs) 
     59   using std::string; 
     60   using std::clog; 
     61   using std::stack; 
     62 
     63   template <typename FeatureT> 
     64   struct push_integer 
     65   { 
     66         push_integer(stack<shared_ptr<expression<FeatureT> > >& exprs) 
    6367            : exprs_(exprs) {} 
    6468         
    65         void operator() (int val) const 
    66         { 
     69         void operator() (int val) const 
     70         { 
    6771            exprs_.push(shared_ptr<expression<FeatureT> > 
    6872                        ( new literal<FeatureT>(val))); 
    69         } 
    70         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    71     }; 
     73         } 
     74         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     75   }; 
    7276    
    73     template <typename FeatureT> 
    74     struct push_real 
    75     { 
    76         push_real(stack<shared_ptr<expression<FeatureT> > >& exprs) 
     77   template <typename FeatureT> 
     78   struct push_real 
     79   { 
     80         push_real(stack<shared_ptr<expression<FeatureT> > >& exprs) 
    7781            : exprs_(exprs) {} 
    78         void operator() (double val) const 
    79         { 
     82         void operator() (double val) const 
     83         { 
    8084            exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(val))); 
    81         } 
    82         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    83     }; 
    84      
    85     template <typename FeatureT> 
    86     struct push_string 
    87     { 
    88         push_string(stack<shared_ptr<expression<FeatureT> > >& exprs) 
     85         } 
     86         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     87   }; 
     88     
     89   template <typename FeatureT> 
     90   struct push_string 
     91   { 
     92         push_string(stack<shared_ptr<expression<FeatureT> > >& exprs, transcoder const& tr) 
     93            : exprs_(exprs), 
     94              tr_(tr) {} 
     95          
     96         template <typename Iter> 
     97         void operator() (Iter start,Iter end) const 
     98         { 
     99            UnicodeString unicode = tr_.transcode(std::string(start,end).c_str()); 
     100            exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(unicode))); 
     101         } 
     102         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     103         transcoder const& tr_; 
     104   }; 
     105     
     106   template <typename FeatureT> 
     107   struct push_property 
     108   { 
     109         push_property(stack<shared_ptr<expression<FeatureT> > >& exprs) 
    89110            : exprs_(exprs) {} 
    90111         
    91         template <typename Iter> 
    92         void operator() (Iter start,Iter end) const 
    93         { 
    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) 
    99            ///{                  
    100            //   str.erase(idx,1); 
    101            //    idx = str.find(quote); 
    102            //} 
    103            UnicodeString str(start,end-start); 
    104            exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(str))); 
    105         } 
    106         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    107     }; 
    108      
    109     template <typename FeatureT> 
    110     struct push_property 
    111     { 
    112         push_property(stack<shared_ptr<expression<FeatureT> > >& exprs) 
    113             : exprs_(exprs) {} 
    114          
    115         template <typename Iter> 
    116         void operator() (Iter start,Iter end) const 
    117         { 
     112         template <typename Iter> 
     113         void operator() (Iter start,Iter end) const 
     114         { 
    118115            string str(start,end); 
    119116            exprs_.push(shared_ptr<expression<FeatureT> >(new property<FeatureT>(str))); 
    120         } 
    121         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    122     }; 
    123  
    124     template <typename FeatureT,typename Op> 
    125     struct compose_expression 
    126     { 
    127         compose_expression(stack<shared_ptr<expression<FeatureT> > >& exprs) 
     117         } 
     118         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     119   }; 
     120 
     121   template <typename FeatureT,typename Op> 
     122   struct compose_expression 
     123   { 
     124         compose_expression(stack<shared_ptr<expression<FeatureT> > >& exprs) 
    128125            : exprs_(exprs) {} 
    129126 
    130         template <typename Iter> 
    131         void operator() (Iter,Iter) const 
    132         { 
     127         template <typename Iter> 
     128         void operator() (Iter,Iter) const 
     129         { 
    133130            if (exprs_.size()>=2) 
    134131            { 
    135                 shared_ptr<expression<FeatureT> > right = exprs_.top(); 
    136                 exprs_.pop(); 
    137                 shared_ptr<expression<FeatureT> > left = exprs_.top(); 
    138                 exprs_.pop(); 
    139                 if (left && right) 
    140                 { 
    141                     exprs_.push(shared_ptr<expression<FeatureT> > 
    142                                 (new mapnik::math_expr_b<FeatureT,Op>(*left,*right))); 
    143                 } 
    144             } 
    145         } 
    146         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    147     }; 
    148      
    149     template <typename FeatureT> 
    150     struct compose_regex 
    151     { 
    152         compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters, 
    153                       stack<shared_ptr<expression<FeatureT> > >& exprs) 
    154             : filters_(filters),exprs_(exprs) {} 
    155  
    156         template <typename Iter> 
    157         void operator() (Iter start,Iter end) const 
    158         { 
    159             if (exprs_.size()>=1) 
    160             { 
    161                 shared_ptr<expression<FeatureT> > exp = exprs_.top(); 
    162                 exprs_.pop(); 
    163                 if (exp) 
    164                 {                    
    165                     std::string pattern(start,end); 
    166                     try  
    167                     { 
    168                         filters_.push(shared_ptr<filter<FeatureT> > 
    169                                       (new regex_filter<FeatureT>(*exp,pattern))); 
    170                     } 
    171                     catch (...)//boost::regex_error& ex) 
    172                     { 
    173                         clog<<"error\n";//ex.what()<<"\n"; 
    174                     } 
    175                      
    176                 } 
    177             } 
    178         } 
    179         stack<shared_ptr<filter<FeatureT> > >& filters_; 
    180         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    181     }; 
    182  
    183    
    184     template <typename FeatureT,typename Op> 
    185     struct compose_filter 
    186     { 
    187         compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters, 
     132               shared_ptr<expression<FeatureT> > right = exprs_.top(); 
     133               exprs_.pop(); 
     134               shared_ptr<expression<FeatureT> > left = exprs_.top(); 
     135               exprs_.pop(); 
     136               if (left && right) 
     137               { 
     138                  exprs_.push(shared_ptr<expression<FeatureT> > 
     139                              (new mapnik::math_expr_b<FeatureT,Op>(*left,*right))); 
     140               } 
     141            } 
     142         } 
     143         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     144   }; 
     145     
     146   template <typename FeatureT> 
     147   struct compose_regex 
     148   { 
     149         compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters, 
    188150                       stack<shared_ptr<expression<FeatureT> > >& exprs) 
    189151            : filters_(filters),exprs_(exprs) {} 
    190152 
    191         template <typename Iter> 
    192         void operator() (Iter,Iter) const 
    193         { 
     153         template <typename Iter> 
     154         void operator() (Iter start,Iter end) const 
     155         { 
     156            if (exprs_.size()>=1) 
     157            { 
     158               shared_ptr<expression<FeatureT> > exp = exprs_.top(); 
     159               exprs_.pop(); 
     160               if (exp) 
     161               {                     
     162                  std::string pattern(start,end); 
     163                  try  
     164                  { 
     165                     filters_.push(shared_ptr<filter<FeatureT> > 
     166                                   (new regex_filter<FeatureT>(*exp,pattern))); 
     167                  } 
     168                  catch (...)//boost::regex_error& ex) 
     169                  { 
     170                     clog<<"error\n";//ex.what()<<"\n"; 
     171                  } 
     172                     
     173               } 
     174            } 
     175         } 
     176         stack<shared_ptr<filter<FeatureT> > >& filters_; 
     177         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     178   }; 
     179 
     180   
     181   template <typename FeatureT,typename Op> 
     182   struct compose_filter 
     183   { 
     184         compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters, 
     185                        stack<shared_ptr<expression<FeatureT> > >& exprs) 
     186            : filters_(filters),exprs_(exprs) {} 
     187 
     188         template <typename Iter> 
     189         void operator() (Iter,Iter) const 
     190         { 
    194191            if (exprs_.size()>=2) 
    195192            { 
    196                 shared_ptr<expression<FeatureT> > right = exprs_.top(); 
    197                 exprs_.pop(); 
    198                 shared_ptr<expression<FeatureT> > left = exprs_.top(); 
    199                 exprs_.pop(); 
    200                 if (left && right) 
    201                 { 
    202                     filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right))); 
    203                 } 
    204             } 
    205         } 
    206         stack<shared_ptr<filter<FeatureT> > >& filters_; 
    207         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
    208     }; 
    209      
    210     template <typename FeatureT> 
    211     struct compose_and_filter 
    212     { 
    213         compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters) 
     193               shared_ptr<expression<FeatureT> > right = exprs_.top(); 
     194               exprs_.pop(); 
     195               shared_ptr<expression<FeatureT> > left = exprs_.top(); 
     196               exprs_.pop(); 
     197               if (left && right) 
     198               { 
     199                  filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right))); 
     200               } 
     201            } 
     202         } 
     203         stack<shared_ptr<filter<FeatureT> > >& filters_; 
     204         stack<shared_ptr<expression<FeatureT> > >& exprs_; 
     205   }; 
     206     
     207   template <typename FeatureT> 
     208   struct compose_and_filter 
     209   { 
     210         compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters) 
    214211            : filters_(filters) {} 
    215212 
    216         template <typename Iter> 
    217         void operator() (Iter,Iter) const 
    218         { 
     213         template <typename Iter> 
     214         void operator() (Iter,Iter) const 
     215         { 
    219216            if (filters_.size()>=2) 
    220217            { 
    221                 shared_ptr<filter<FeatureT> > right = filters_.top(); 
    222                 filters_.pop(); 
    223                 shared_ptr<filter<FeatureT> > left = filters_.top(); 
    224                 filters_.pop(); 
    225                 if (left && right) 
    226                 { 
    227                     filters_.push(shared_ptr<filter<FeatureT> > 
    228                                   (new logical_and<FeatureT>(*left,*right))); 
    229                 } 
    230             } 
    231         } 
    232         stack<shared_ptr<filter<FeatureT> > >& filters_; 
    233     }; 
    234      
    235     template <typename FeatureT> 
    236     struct compose_or_filter 
    237     { 
    238         compose_or_filter(stack<shared_ptr<filter<FeatureT> > >& filters) 
     218               shared_ptr<filter<FeatureT> > right = filters_.top(); 
     219               filters_.pop(); 
     220               shared_ptr<filter<FeatureT> > left = filters_.top(); 
     221               filters_.pop(); 
     222               if (left && right) 
     223               { 
     224                  filters_.push(shared_ptr<filter<FeatureT> > 
     225                                (new logical_and<FeatureT>(*left,*right))); 
     226               } 
     227            } 
     228         } 
     229         stack<shared_ptr<filter<FeatureT> > >& filters_; 
     230   }; 
     231     
     232   template <typename FeatureT> 
     233   struct compose_or_filter 
     234   { 
     235         compose_or_filter(stack<shared_ptr<filter<FeatureT> > >& filters) 
    239236            : filters_(filters) {} 
    240237 
    241         template <typename Iter> 
    242         void operator() (Iter,Iter) const 
    243         { 
     238         template <typename Iter> 
     239         void operator() (Iter,Iter) const 
     240         { 
    244241            if (filters_.size()>=2) 
    245242            { 
    246                 shared_ptr<filter<FeatureT> > right = filters_.top(); 
    247                 filters_.pop(); 
    248                 shared_ptr<filter<FeatureT> > left = filters_.top(); 
    249                 filters_.pop(); 
    250                 if (left && right) 
    251                 { 
    252                     filters_.push(shared_ptr<filter<FeatureT> > 
    253                                   (new logical_or<FeatureT>(*left,*right))); 
    254                 } 
    255             } 
    256         } 
    257         stack<shared_ptr<filter<FeatureT> > >& filters_; 
    258     }; 
    259      
    260     template <typename FeatureT> 
    261     struct compose_not_filter 
    262     { 
    263         compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters) 
     243               shared_ptr<filter<FeatureT> > right = filters_.top(); 
     244               filters_.pop(); 
     245               shared_ptr<filter<FeatureT> > left = filters_.top(); 
     246               filters_.pop(); 
     247               if (left && right) 
     248               { 
     249                  filters_.push(shared_ptr<filter<FeatureT> > 
     250                                (new logical_or<FeatureT>(*left,*right))); 
     251               } 
     252            } 
     253         } 
     254         stack<shared_ptr<filter<FeatureT> > >& filters_; 
     255   }; 
     256     
     257   template <typename FeatureT> 
     258   struct compose_not_filter 
     259   { 
     260         compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters) 
    264261            : filters_(filters) {} 
    265262 
    266         template <typename Iter> 
    267         void operator() (Iter,Iter) const 
    268         { 
     263         template <typename Iter> 
     264         void operator() (Iter,Iter) const 
     265         { 
    269266            if (filters_.size()>=1) 
    270267            { 
    271                 shared_ptr<filter<FeatureT> > filter_ = filters_.top(); 
    272                 filters_.pop(); 
    273                 if (filter_) 
    274                 { 
    275                     filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_))); 
    276                 } 
    277             } 
    278         } 
    279         stack<shared_ptr<filter<FeatureT> > >& filters_; 
    280     }; 
    281      
    282     template <typename FeatureT> 
    283     struct filter_grammar : public grammar<filter_grammar<FeatureT> > 
    284     { 
    285         filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_, 
    286                        stack<shared_ptr<expression<FeatureT> > >& exprs_) 
    287             : filters(filters_),exprs(exprs_) {} 
    288          
    289         template <typename ScannerT> 
    290         struct definition 
    291         { 
    292             definition(filter_grammar const& self) 
    293             {    
    294                 typedef boost::spirit::chset<wchar_t> chset_t; 
    295  
    296                 func1_op = "sqrt","sin","cos"; 
    297                 func2_op = "min","max"; 
    298                 spatial_op = "Equals","Disjoint","Touches","Within","Overlaps", 
    299                     "Crosses","Intersects","Contains","DWithin","Beyond","BBOX"; 
    300                  
    301                 chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E" 
    302                                   L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217" 
    303                                   L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE" 
    304                                   L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F" 
    305                                   L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB" 
    306                                   L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA" 
    307                                   L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE" 
    308                                   L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C" 
    309                                   L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD" 
    310                                   L"\x9DF-\x9E1\x9F0-\x9F1\xA05-\xA0A\xA0F-\xA10\xA13-\xA28\xA2A-\xA30" 
    311                                   L"\xA32-\xA33\xA35-\xA36\xA38-\xA39\xA59-\xA5C\xA5E\xA72-\xA74" 
    312                                   L"\xA85-\xA8B\xA8D\xA8F-\xA91\xA93-\xAA8\xAAA-\xAB0\xAB2-\xAB3" 
    313                                   L"\xAB5-\xAB9\xABD\xAE0\xB05-\xB0C\xB0F-\xB10\xB13-\xB28\xB2A-\xB30" 
    314                                   L"\xB32-\xB33\xB36-\xB39\xB3D\xB5C-\xB5D\xB5F-\xB61\xB85-\xB8A" 
    315                                   L"\xB8E-\xB90\xB92-\xB95\xB99-\xB9A\xB9C\xB9E-\xB9F\xBA3-\xBA4" 
    316                                   L"\xBA8-\xBAA\xBAE-\xBB5\xBB7-\xBB9\xC05-\xC0C\xC0E-\xC10\xC12-\xC28" 
    317                                   L"\xC2A-\xC33\xC35-\xC39\xC60-\xC61\xC85-\xC8C\xC8E-\xC90\xC92-\xCA8" 
    318                                   L"\xCAA-\xCB3\xCB5-\xCB9\xCDE\xCE0-\xCE1\xD05-\xD0C\xD0E-\xD10" 
    319                                   L"\xD12-\xD28\xD2A-\xD39\xD60-\xD61\xE01-\xE2E\xE30\xE32-\xE33" 
    320                                   L"\xE40-\xE45\xE81-\xE82\xE84\xE87-\xE88\xE8A\xE8D\xE94-\xE97" 
    321                                   L"\xE99-\xE9F\xEA1-\xEA3\xEA5\xEA7\xEAA-\xEAB\xEAD-\xEAE\xEB0" 
    322                                   L"\xEB2-\xEB3\xEBD\xEC0-\xEC4\xF40-\xF47\xF49-\xF69\x10A0-\x10C5" 
    323                                   L"\x10D0-\x10F6\x1100\x1102-\x1103\x1105-\x1107\x1109\x110B-\x110C" 
    324                                   L"\x110E-\x1112\x113C\x113E\x1140\x114C\x114E\x1150\x1154-\x1155" 
    325                                   L"\x1159\x115F-\x1161\x1163\x1165\x1167\x1169\x116D-\x116E" 
    326                                   L"\x1172-\x1173\x1175\x119E\x11A8\x11AB\x11AE-\x11AF\x11B7-\x11B8" 
    327                                   L"\x11BA\x11BC-\x11C2\x11EB\x11F0\x11F9\x1E00-\x1E9B\x1EA0-\x1EF9" 
    328                                   L"\x1F00-\x1F15\x1F18-\x1F1D\x1F20-\x1F45\x1F48-\x1F4D\x1F50-\x1F57" 
    329                                   L"\x1F59\x1F5B\x1F5D\x1F5F-\x1F7D\x1F80-\x1FB4\x1FB6-\x1FBC\x1FBE" 
    330                                   L"\x1FC2-\x1FC4\x1FC6-\x1FCC\x1FD0-\x1FD3\x1FD6-\x1FDB\x1FE0-\x1FEC" 
    331                                   L"\x1FF2-\x1FF4\x1FF6-\x1FFC\x2126\x212A-\x212B\x212E\x2180-\x2182" 
    332                                   L"\x3041-\x3094\x30A1-\x30FA\x3105-\x312C\xAC00-\xD7A3"); 
     268               shared_ptr<filter<FeatureT> > filter_ = filters_.top(); 
     269               filters_.pop(); 
     270               if (filter_) 
     271               { 
     272                  filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_))); 
     273               } 
     274            } 
     275         } 
     276         stack<shared_ptr<filter<FeatureT> > >& filters_; 
     277   }; 
     278     
     279   template <typename FeatureT> 
     280   struct filter_grammar : public grammar<filter_grammar<FeatureT> > 
     281   { 
     282         filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_, 
     283                        stack<shared_ptr<expression<FeatureT> > >& exprs_, 
     284                        transcoder const& tr_) 
     285            : filters(filters_), 
     286              exprs(exprs_), 
     287              tr(tr_) {} 
     288          
     289         template <typename ScannerT> 
     290         struct definition 
     291         { 
     292               definition(filter_grammar const& self) 
     293               {         
     294                  typedef boost::spirit::chset<wchar_t> chset_t; 
     295 
     296                  func1_op = "sqrt","sin","cos"; 
     297                  func2_op = "min","max"; 
     298                  spatial_op = "Equals","Disjoint","Touches","Within","Overlaps", 
     299                     "Crosses","Intersects","Contains","DWithin","Beyond","BBOX"; 
     300                   
     301                  chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E" 
     302                                    L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217" 
     303                                    L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE" 
     304                                    L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F" 
     305                                    L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB" 
     306                                    L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA" 
     307                                    L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE" 
     308                                    L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C" 
     309                                    L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD" 
     310                            &n