summaryrefslogtreecommitdiff
path: root/examples/parse_python_value.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/parse_python_value.py')
-rw-r--r--examples/parse_python_value.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/examples/parse_python_value.py b/examples/parse_python_value.py
new file mode 100644
index 0000000..cb4288f
--- /dev/null
+++ b/examples/parse_python_value.py
@@ -0,0 +1,80 @@
+# parsePythonValue.py
+#
+# Copyright, 2006, by Paul McGuire
+#
+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.as_list())
+cvtSet = lambda toks: set(toks.as_list())
+cvtDict = lambda toks: dict(toks.as_list())
+cvtList = lambda toks: [toks.as_list()]
+
+# define punctuation as suppressed literals
+lparen, rparen, lbrack, rbrack, lbrace, rbrace, colon, comma = pp.Suppress.using_each("()[]{}:,")
+
+integer = pp.Regex(r"[+-]?\d+").set_name("integer").add_parse_action(cvtInt)
+real = pp.Regex(r"[+-]?\d+\.\d*([Ee][+-]?\d+)?").set_name("real").add_parse_action(cvtReal)
+tuple_str = pp.Forward().set_name("tuple_expr")
+list_str = pp.Forward().set_name("list_expr")
+set_str = pp.Forward().set_name("set_expr")
+dict_str = pp.Forward().set_name("dict_expr")
+
+unistr = pp.unicodeString().add_parse_action(lambda t: t[0][2:-1])
+quoted_str = pp.quotedString().add_parse_action(lambda t: t[0][1:-1])
+bool_literal = pp.oneOf("True False", as_keyword=True).add_parse_action(cvtBool)
+none_literal = pp.Keyword("None").add_parse_action(pp.replace_with(None))
+
+list_item = (
+ real
+ | integer
+ | quoted_str
+ | unistr
+ | bool_literal
+ | none_literal
+ | pp.Group(list_str)
+ | tuple_str
+ | set_str
+ | dict_str
+).set_name("list_item")
+
+tuple_str <<= (
+ lparen + pp.Opt(pp.DelimitedList(list_item, allow_trailing_delim=True)) + rparen
+)
+tuple_str.add_parse_action(cvtTuple)
+
+set_str <<= (
+ lbrace + pp.DelimitedList(list_item, allow_trailing_delim=True) + rbrace
+)
+set_str.add_parse_action(cvtSet)
+
+list_str <<= (
+ lbrack + pp.Opt(pp.DelimitedList(list_item, allow_trailing_delim=True)) + rbrack
+)
+list_str.add_parse_action(cvtList, lambda t: t[0])
+
+dict_entry = pp.Group(list_item + colon + list_item).set_name("dict_entry")
+dict_str <<= (
+ lbrace + pp.Opt(pp.DelimitedList(dict_entry, allow_trailing_delim=True)) + rbrace
+)
+dict_str.add_parse_action(cvtDict)
+
+if __name__ == "__main__":
+
+ 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} }
+ { 1, 2, 11, "blah" }
+ { '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'"""
+
+ list_item.run_tests(tests)
+ list_item.create_diagram("parse_python_value.html")