# HG changeset patch # User Adrien Di Mascio <Adrien.DiMascio@logilab.fr> # Date 1303899882 -7200 # Wed Apr 27 12:24:42 2011 +0200 # Node ID a170ddc7f4c6dbcc418394221471979571fdd1e2 # Parent 64531b6511838533f4246987d1ce352c14fc851d [rql] basic support for regexp-based pattern matching using a REGEXP operator diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/nodes.py b/nodes.py --- a/nodes.py +++ b/nodes.py @@ -481,7 +481,7 @@ self.optional= value -OPERATORS = frozenset(('=', '!=', '<', '<=', '>=', '>', 'ILIKE', 'LIKE')) +OPERATORS = frozenset(('=', '!=', '<', '<=', '>=', '>', 'ILIKE', 'LIKE', 'REGEXP')) class Comparison(HSMixin, Node): """handle comparisons: diff --git a/parser.g b/parser.g --- a/parser.g +++ b/parser.g @@ -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*(?=\()' diff --git a/parser.py b/parser.py --- a/parser.py +++ b/parser.py @@ -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)