# HG changeset patch # User paulb@localhost.localdomain # Date 1180809251 -7200 # Node ID 7dc252a54035ee5d67aa1049e8188de0c58df195 # Parent af7fb0139dae068cb9eccb085219c3c47169e5c2 Changed the pyparsing implementation to return the same regions output as the regular expression implementation. Added a simple test program. diff -r af7fb0139dae -r 7dc252a54035 sqlliterals/pyparser.py --- a/sqlliterals/pyparser.py Sat Jun 02 20:03:42 2007 +0200 +++ b/sqlliterals/pyparser.py Sat Jun 02 20:34:11 2007 +0200 @@ -31,19 +31,19 @@ class Grammar: - """ - A convenience class whose objects enforce grouping and naming of grammar - rules. - """ + "A convenience class whose objects enforce the naming of grammar rules." def __setattr__(self, name, value): - self.__dict__[name] = Group(value).setResultsName(name) + self.__dict__[name] = value.setResultsName(name) + +# NOTE: Sufficient grouping seems to be provided by pyparsing. +# NOTE: Otherwise, we might introduce Group objects in the above class. g = grammar = Grammar() -g.non_literal = OneOrMore(CharsNotIn("'")) +g.non_literal = Combine(OneOrMore(CharsNotIn("'"))) g.value = ZeroOrMore(Or([Literal("''"), CharsNotIn("'")])) -g.literal = Literal("'") + g.value + Literal("'") +g.literal = Combine(Literal("'") + g.value + Literal("'")) g.query = ZeroOrMore(Or([g.non_literal, g.literal])) g.query.leaveWhitespace() @@ -51,6 +51,16 @@ "Return a pyparsing result object from the parsing of the string 's'." - return g.query.parseString(s) + regions = [] + first = 1 + for region in g.query.parseString(s).asList(): + if isinstance(region, list): + if first: + regions.append("") + regions.append(region[0]) + else: + regions.append(region) + first = 0 + return regions # vim: tabstop=4 expandtab shiftwidth=4 diff -r af7fb0139dae -r 7dc252a54035 test.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test.py Sat Jun 02 20:34:11 2007 +0200 @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +"Test sqlliterals." + +import sqlliterals.pyparser +import sqlliterals.regexp + +def show(regions): + non_literal = 1 + for region in regions: + print region, + if non_literal: + print "(NL)", + else: + print "(L)", + non_literal = not non_literal + print + +l = [ + "a = a", + "a = 'a'", + "'a' = a", + "'a' = 'a'", + "a = ''''", + "'''' = a", + "'''' = ''''", + "a = '''a'''", + "'''a''' = a", + "'''a''' = '''a'''" + ] + +for s in l: + show(sqlliterals.pyparser.parseString(s)) + show(sqlliterals.regexp.parseString(s)) + +# vim: tabstop=4 expandtab shiftwidth=4