| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- # parsePythonValue.py
- #
- # Copyright, 2006, by Paul McGuire
- #
- from __future__ import print_function
- import pyparsing as pp
- cvtBool = lambda t:t[0]=='True'
- cvtInt = lambda toks: int(toks[0])
- cvtReal = lambda toks: float(toks[0])
- cvtTuple = lambda toks : tuple(toks.asList())
- cvtDict = lambda toks: dict(toks.asList())
- cvtList = lambda toks: [toks.asList()]
- # define punctuation as suppressed literals
- lparen, rparen, lbrack, rbrack, lbrace, rbrace, colon, comma = map(pp.Suppress,"()[]{}:,")
- integer = pp.Regex(r"[+-]?\d+").setName("integer").setParseAction(cvtInt )
- real = pp.Regex(r"[+-]?\d+\.\d*([Ee][+-]?\d+)?").setName("real").setParseAction(cvtReal)
- tupleStr = pp.Forward()
- listStr = pp.Forward()
- dictStr = pp.Forward()
- pp.unicodeString.setParseAction(lambda t:t[0][2:-1])
- pp.quotedString.setParseAction(lambda t:t[0][1:-1])
- boolLiteral = pp.oneOf("True False").setParseAction(cvtBool)
- noneLiteral = pp.Literal("None").setParseAction(pp.replaceWith(None))
- listItem = (real
- | integer
- | pp.quotedString
- | pp.unicodeString
- | boolLiteral
- | noneLiteral
- | pp.Group(listStr)
- | tupleStr
- | dictStr)
- tupleStr << (lparen
- + pp.Optional(pp.delimitedList(listItem))
- + pp.Optional(comma)
- + rparen)
- tupleStr.setParseAction(cvtTuple)
- listStr << (lbrack
- + pp.Optional(pp.delimitedList(listItem) + pp.Optional(comma))
- + rbrack)
- listStr.setParseAction(cvtList, lambda t: t[0])
- dictEntry = pp.Group(listItem + colon + listItem)
- dictStr << (lbrace
- + pp.Optional(pp.delimitedList(dictEntry) + pp.Optional(comma))
- + rbrace)
- dictStr.setParseAction(cvtDict)
- tests = """['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ]
- [{0: [2], 1: []}, {0: [], 1: [], 2: []}, {0: [1, 2]}]
- { 'A':1, 'B':2, 'C': {'a': 1.2, 'b': 3.4} }
- 3.14159
- 42
- 6.02E23
- 6.02e+023
- 1.0e-7
- 'a quoted string'"""
- listItem.runTests(tests)
|