summaryrefslogtreecommitdiff
path: root/src/examples/parseListString.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/examples/parseListString.py')
-rw-r--r--src/examples/parseListString.py42
1 files changed, 12 insertions, 30 deletions
diff --git a/src/examples/parseListString.py b/src/examples/parseListString.py
index a6f07a1..d74f3af 100644
--- a/src/examples/parseListString.py
+++ b/src/examples/parseListString.py
@@ -27,8 +27,7 @@ rbrack = Literal("]").suppress()
cvtInt = lambda s,l,toks: int(toks[0])
integer = Word(nums).setName("integer").setParseAction( cvtInt )
cvtReal = lambda s,l,toks: float(toks[0])
-real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." +
- Optional(Word(nums))).setName("real").setParseAction( cvtReal )
+real = Regex(r'[+-]?\d+\.\d*').setName("floating-point number").setParseAction( cvtReal )
listItem = real | integer | quotedString.setParseAction( removeQuotes )
listStr = lbrack + delimitedList(listItem) + rbrack
@@ -44,8 +43,7 @@ cvtReal = lambda s,l,toks: float(toks[0])
lbrack = Literal("[").suppress()
rbrack = Literal("]").suppress()
integer = Word(nums).setName("integer").setParseAction( cvtInt )
-real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." +
- Optional(Word(nums))).setName("real").setParseAction( cvtReal )
+real = Regex(r'[+-]?\d+\.\d*').setName("floating-point number").setParseAction( cvtReal )
tupleStr = Forward()
listStr = Forward()
listItem = real | integer | quotedString.setParseAction(removeQuotes) | Group(listStr) | tupleStr
@@ -56,25 +54,7 @@ listStr << lbrack + delimitedList(listItem) + Optional(Suppress(",")) + rbrack
test = "['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ]"
print(listStr.parseString(test))
-# fourth pass, just parsing tuples of numbers
-#~ from pyparsing import *
-
-#~ integer = (Word(nums)|Word('-+',nums)).setName("integer")
-#~ real = Combine(integer + "." + Optional(Word(nums))).setName("real")
-#~ tupleStr = Forward().setName("tuple")
-#~ tupleItem = real | integer | tupleStr
-#~ tupleStr << ( Suppress("(") + delimitedList(tupleItem) +
- #~ Optional(Suppress(",")) + Suppress(")") )
-
-#~ # add parse actions to do conversion during parsing
-#~ integer.setParseAction( lambda toks: int(toks[0]) )
-#~ real.setParseAction( lambda toks: float(toks[0]) )
-#~ tupleStr.setParseAction( lambda toks: tuple(toks) )
-
-#~ s = '((1,2), (3,4), (-5,9.2),)'
-#~ print tupleStr.parseString(s)[0]
-
-
+# fourth pass, add parsing of dicts
cvtInt = lambda s,l,toks: int(toks[0])
cvtReal = lambda s,l,toks: float(toks[0])
cvtDict = lambda s,l,toks: dict(toks[0])
@@ -85,16 +65,18 @@ lbrace = Literal("{").suppress()
rbrace = Literal("}").suppress()
colon = Literal(":").suppress()
integer = Word(nums).setName("integer").setParseAction( cvtInt )
-real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." +
- Optional(Word(nums))).setName("real").setParseAction( cvtReal )
+real = Regex(r'[+-]?\d+\.\d*').setName("real").setParseAction( cvtReal )
+
tupleStr = Forward()
listStr = Forward()
dictStr = Forward()
listItem = real | integer | quotedString.setParseAction(removeQuotes) | Group(listStr) | tupleStr | dictStr
-tupleStr << ( Suppress("(") + delimitedList(listItem) + Optional(Suppress(",")) + Suppress(")") )
+tupleStr <<= ( Suppress("(") + delimitedList(listItem) + Optional(Suppress(",")) + Suppress(")") )
tupleStr.setParseAction( lambda t:tuple(t.asList()) )
-listStr << lbrack + delimitedList(listItem) + Optional(Suppress(",")) + rbrack
-dictStr << rbrace + delimitedList( Group( listItem + colon + listItem ) ) + rbrace
-test = "['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ]"
-test = '[{0: [2], 1: []}, {0: [], 1: [], 2: []}, {0: [1, 2]}]'
+listStr <<= (lbrack + Optional(delimitedList(listItem)) + Optional(Suppress(",")) + rbrack)
+dictKeyStr = real | integer | quotedString.setParseAction(removeQuotes)
+dictStr <<= lbrace + Optional(delimitedList( Group( dictKeyStr + colon + listItem ))) + Optional(Suppress(",")) + rbrace
+dictStr.setParseAction(lambda t: dict((k_v[0],(k_v[1].asList() if isinstance(k_v[1],ParseResults) else k_v[1])) for k_v in t))
+
+test = '[{0: [2], 1: []}, {0: [], 1: [], 2: [,]}, {0: [1, 2,],}]'
print(listStr.parseString(test))