1.1 --- a/sqlliterals/pyparser.py Sat Jun 02 20:03:42 2007 +0200
1.2 +++ b/sqlliterals/pyparser.py Sat Jun 02 20:34:11 2007 +0200
1.3 @@ -31,19 +31,19 @@
1.4
1.5 class Grammar:
1.6
1.7 - """
1.8 - A convenience class whose objects enforce grouping and naming of grammar
1.9 - rules.
1.10 - """
1.11 + "A convenience class whose objects enforce the naming of grammar rules."
1.12
1.13 def __setattr__(self, name, value):
1.14 - self.__dict__[name] = Group(value).setResultsName(name)
1.15 + self.__dict__[name] = value.setResultsName(name)
1.16 +
1.17 +# NOTE: Sufficient grouping seems to be provided by pyparsing.
1.18 +# NOTE: Otherwise, we might introduce Group objects in the above class.
1.19
1.20 g = grammar = Grammar()
1.21
1.22 -g.non_literal = OneOrMore(CharsNotIn("'"))
1.23 +g.non_literal = Combine(OneOrMore(CharsNotIn("'")))
1.24 g.value = ZeroOrMore(Or([Literal("''"), CharsNotIn("'")]))
1.25 -g.literal = Literal("'") + g.value + Literal("'")
1.26 +g.literal = Combine(Literal("'") + g.value + Literal("'"))
1.27 g.query = ZeroOrMore(Or([g.non_literal, g.literal]))
1.28 g.query.leaveWhitespace()
1.29
1.30 @@ -51,6 +51,16 @@
1.31
1.32 "Return a pyparsing result object from the parsing of the string 's'."
1.33
1.34 - return g.query.parseString(s)
1.35 + regions = []
1.36 + first = 1
1.37 + for region in g.query.parseString(s).asList():
1.38 + if isinstance(region, list):
1.39 + if first:
1.40 + regions.append("")
1.41 + regions.append(region[0])
1.42 + else:
1.43 + regions.append(region)
1.44 + first = 0
1.45 + return regions
1.46
1.47 # vim: tabstop=4 expandtab shiftwidth=4
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/test.py Sat Jun 02 20:34:11 2007 +0200
2.3 @@ -0,0 +1,36 @@
2.4 +#!/usr/bin/env python
2.5 +
2.6 +"Test sqlliterals."
2.7 +
2.8 +import sqlliterals.pyparser
2.9 +import sqlliterals.regexp
2.10 +
2.11 +def show(regions):
2.12 + non_literal = 1
2.13 + for region in regions:
2.14 + print region,
2.15 + if non_literal:
2.16 + print "(NL)",
2.17 + else:
2.18 + print "(L)",
2.19 + non_literal = not non_literal
2.20 + print
2.21 +
2.22 +l = [
2.23 + "a = a",
2.24 + "a = 'a'",
2.25 + "'a' = a",
2.26 + "'a' = 'a'",
2.27 + "a = ''''",
2.28 + "'''' = a",
2.29 + "'''' = ''''",
2.30 + "a = '''a'''",
2.31 + "'''a''' = a",
2.32 + "'''a''' = '''a'''"
2.33 + ]
2.34 +
2.35 +for s in l:
2.36 + show(sqlliterals.pyparser.parseString(s))
2.37 + show(sqlliterals.regexp.parseString(s))
2.38 +
2.39 +# vim: tabstop=4 expandtab shiftwidth=4