parsePythonValue.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. # parsePythonValue.py
  2. #
  3. # Copyright, 2006, by Paul McGuire
  4. #
  5. from __future__ import print_function
  6. import pyparsing as pp
  7. cvtBool = lambda t:t[0]=='True'
  8. cvtInt = lambda toks: int(toks[0])
  9. cvtReal = lambda toks: float(toks[0])
  10. cvtTuple = lambda toks : tuple(toks.asList())
  11. cvtDict = lambda toks: dict(toks.asList())
  12. cvtList = lambda toks: [toks.asList()]
  13. # define punctuation as suppressed literals
  14. lparen, rparen, lbrack, rbrack, lbrace, rbrace, colon, comma = map(pp.Suppress,"()[]{}:,")
  15. integer = pp.Regex(r"[+-]?\d+").setName("integer").setParseAction(cvtInt )
  16. real = pp.Regex(r"[+-]?\d+\.\d*([Ee][+-]?\d+)?").setName("real").setParseAction(cvtReal)
  17. tupleStr = pp.Forward()
  18. listStr = pp.Forward()
  19. dictStr = pp.Forward()
  20. pp.unicodeString.setParseAction(lambda t:t[0][2:-1])
  21. pp.quotedString.setParseAction(lambda t:t[0][1:-1])
  22. boolLiteral = pp.oneOf("True False").setParseAction(cvtBool)
  23. noneLiteral = pp.Literal("None").setParseAction(pp.replaceWith(None))
  24. listItem = (real
  25. | integer
  26. | pp.quotedString
  27. | pp.unicodeString
  28. | boolLiteral
  29. | noneLiteral
  30. | pp.Group(listStr)
  31. | tupleStr
  32. | dictStr)
  33. tupleStr << (lparen
  34. + pp.Optional(pp.delimitedList(listItem))
  35. + pp.Optional(comma)
  36. + rparen)
  37. tupleStr.setParseAction(cvtTuple)
  38. listStr << (lbrack
  39. + pp.Optional(pp.delimitedList(listItem) + pp.Optional(comma))
  40. + rbrack)
  41. listStr.setParseAction(cvtList, lambda t: t[0])
  42. dictEntry = pp.Group(listItem + colon + listItem)
  43. dictStr << (lbrace
  44. + pp.Optional(pp.delimitedList(dictEntry) + pp.Optional(comma))
  45. + rbrace)
  46. dictStr.setParseAction(cvtDict)
  47. tests = """['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ]
  48. [{0: [2], 1: []}, {0: [], 1: [], 2: []}, {0: [1, 2]}]
  49. { 'A':1, 'B':2, 'C': {'a': 1.2, 'b': 3.4} }
  50. 3.14159
  51. 42
  52. 6.02E23
  53. 6.02e+023
  54. 1.0e-7
  55. 'a quoted string'"""
  56. listItem.runTests(tests)