--- a/ChangeLog Wed Apr 27 11:37:03 2011 +0200
+++ b/ChangeLog Wed Apr 27 12:24:42 2011 +0200
@@ -4,7 +4,7 @@
--
* support != operator for non equality
* support for CAST function
-
+* support for regexp-based pattern matching using a REGEXP operator
2011-01-12 -- 0.28.0
* enhance rewrite_shared_optional so one can specify where the new identity
--- a/nodes.py Wed Apr 27 11:37:03 2011 +0200
+++ b/nodes.py Wed Apr 27 12:24:42 2011 +0200
@@ -481,7 +481,7 @@
self.optional= value
-OPERATORS = frozenset(('=', '!=', '<', '<=', '>=', '>', 'ILIKE', 'LIKE'))
+OPERATORS = frozenset(('=', '!=', '<', '<=', '>=', '>', 'ILIKE', 'LIKE', 'REGEXP'))
class Comparison(HSMixin, Node):
"""handle comparisons:
--- a/parser.g Wed Apr 27 11:37:03 2011 +0200
+++ b/parser.g Wed Apr 27 12:24:42 2011 +0200
@@ -88,7 +88,7 @@
token FALSE: r'(?i)FALSE'
token NULL: r'(?i)NULL'
token EXISTS: r'(?i)EXISTS'
- token CMP_OP: r'(?i)<=|<|>=|>|!=|=|~=|LIKE|ILIKE'
+ token CMP_OP: r'(?i)<=|<|>=|>|!=|=|~=|LIKE|ILIKE|REGEXP'
token ADD_OP: r'\+|-'
token MUL_OP: r'\*|/'
token FUNCTION: r'[A-Za-z_]+\s*(?=\()'
--- a/parser.py Wed Apr 27 11:37:03 2011 +0200
+++ b/parser.py Wed Apr 27 12:24:42 2011 +0200
@@ -1,22 +1,8 @@
-# copyright 2004-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
-# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
-#
-# This file is part of rql.
-#
-# rql is free software: you can redistribute it and/or modify it under the
-# terms of the GNU Lesser General Public License as published by the Free
-# Software Foundation, either version 2.1 of the License, or (at your option)
-# any later version.
-#
-# rql is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Lesser General Public License along
-# with rql. If not, see <http://www.gnu.org/licenses/>.
"""yapps input grammar for RQL.
+:organization: Logilab
+:copyright: 2003-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
Select statement grammar
@@ -109,7 +95,7 @@
('FALSE', re.compile('(?i)FALSE')),
('NULL', re.compile('(?i)NULL')),
('EXISTS', re.compile('(?i)EXISTS')),
- ('CMP_OP', re.compile('(?i)<=|<|>=|>|!=|=|~=|LIKE|ILIKE')),
+ ('CMP_OP', re.compile('(?i)<=|<|>=|>|!=|=|~=|LIKE|ILIKE|REGEXP')),
('ADD_OP', re.compile('\\+|-')),
('MUL_OP', re.compile('\\*|/')),
('FUNCTION', re.compile('[A-Za-z_]+\\s*(?=\\()')),
@@ -709,7 +695,7 @@
P = Hercule(HerculeScanner(text))
return runtime.wrap_error_reporter(P, rule)
-if __name__ == 'old__main__':
+if __name__ == '__main__':
from sys import argv, stdin
if len(argv) >= 2:
if len(argv) >= 3:
@@ -719,25 +705,3 @@
print parse(argv[1], f.read())
else: print >>sys.stderr, 'Args: <rule> [<filename>]'
# End -- grammar generated by Yapps
-"""Main parser command.
-
-"""
-__docformat__ = "restructuredtext en"
-
-if __name__ == '__main__':
- from sys import argv
-
- parser = Hercule(HerculeScanner(argv[1]))
- e_types = {}
- # parse the RQL string
- try:
- tree = parser.goal(e_types)
- print '-'*80
- print tree
- print '-'*80
- print repr(tree)
- print e_types
- except SyntaxError, ex:
- # try to get error message from yapps
- from yapps.runtime import print_error
- print_error(ex, parser._scanner)