diff options
author | ptmcg <ptmcg@austin.rr.com> | 2020-04-26 10:33:12 -0500 |
---|---|---|
committer | ptmcg <ptmcg@austin.rr.com> | 2020-04-26 10:33:12 -0500 |
commit | 203fa36d7ae6b79344e4bf13531b77c09f313793 (patch) | |
tree | 443459f498f38b97618344c6f707eeaa117cf670 /examples | |
parent | 813ba3bed433a96e02d82cad2e2940a6850d96a5 (diff) | |
download | pyparsing-git-203fa36d7ae6b79344e4bf13531b77c09f313793.tar.gz |
change some lambdas to explicit methods for clarity (see discussion in #207); deleted duplicated examples (commit *all* changes this time)
Diffstat (limited to 'examples')
-rw-r--r-- | examples/chemicalFormulas.py | 36 | ||||
-rw-r--r-- | examples/excelExpr.py | 20 | ||||
-rw-r--r-- | examples/fourFn.py | 18 | ||||
-rw-r--r-- | examples/holaMundo.py | 9 | ||||
-rw-r--r-- | examples/htmlTableParser.py | 8 | ||||
-rw-r--r-- | examples/list1.py | 60 | ||||
-rw-r--r-- | examples/parseListString.py | 112 | ||||
-rw-r--r-- | examples/parsePythonValue.py | 18 | ||||
-rw-r--r-- | examples/shapes.py | 6 | ||||
-rw-r--r-- | examples/simpleArith.py | 4 | ||||
-rw-r--r-- | examples/stackish.py | 35 |
11 files changed, 100 insertions, 226 deletions
diff --git a/examples/chemicalFormulas.py b/examples/chemicalFormulas.py index f4725ed..f7c7d14 100644 --- a/examples/chemicalFormulas.py +++ b/examples/chemicalFormulas.py @@ -26,7 +26,11 @@ element = pp.Word(pp.alphas.upper(), pp.alphas.lower(), max=2) elementRef = pp.Group(element + pp.Optional(pp.Word(digits), default="1"))
formula = elementRef[...]
-fn = lambda elemList: sum(atomicWeight[elem] * int(qty) for elem, qty in elemList)
+
+def sum_atomic_weights(element_list):
+ return sum(atomicWeight[elem] * int(qty) for elem, qty in element_list)
+
+
formula.runTests(
"""\
H2O
@@ -34,7 +38,9 @@ formula.runTests( NaCl
""",
fullDump=False,
- postParse=lambda _, tokens: "Molecular weight: {}".format(fn(tokens)),
+ postParse=lambda _, tokens: "Molecular weight: {}".format(
+ sum_atomic_weights(tokens)
+ ),
)
print()
@@ -44,9 +50,11 @@ elementRef = pp.Group( )
formula = elementRef[...]
-fn = lambda elemList: sum(
- atomicWeight[elem.symbol] * int(elem.qty) for elem in elemList
-)
+
+def sum_atomic_weights_by_results_name(element_list):
+ return sum(atomicWeight[elem.symbol] * int(elem.qty) for elem in element_list)
+
+
formula.runTests(
"""\
H2O
@@ -54,7 +62,9 @@ formula.runTests( NaCl
""",
fullDump=False,
- postParse=lambda _, tokens: "Molecular weight: {}".format(fn(tokens)),
+ postParse=lambda _, tokens: "Molecular weight: {}".format(
+ sum_atomic_weights_by_results_name(tokens)
+ ),
)
print()
@@ -63,7 +73,11 @@ integer = pp.Word(digits).setParseAction(lambda t: int(t[0])) elementRef = pp.Group(element("symbol") + pp.Optional(integer, default=1)("qty"))
formula = elementRef[...]
-fn = lambda elemList: sum(atomicWeight[elem.symbol] * elem.qty for elem in elemList)
+
+def sum_atomic_weights_by_results_name_with_converted_ints(element_list):
+ return sum(atomicWeight[elem.symbol] * int(elem.qty) for elem in element_list)
+
+
formula.runTests(
"""\
H2O
@@ -71,7 +85,9 @@ formula.runTests( NaCl
""",
fullDump=False,
- postParse=lambda _, tokens: "Molecular weight: {}".format(fn(tokens)),
+ postParse=lambda _, tokens: "Molecular weight: {}".format(
+ sum_atomic_weights_by_results_name_with_converted_ints(tokens)
+ ),
)
print()
@@ -98,6 +114,8 @@ formula.runTests( NaCl
""",
fullDump=False,
- postParse=lambda _, tokens: "Molecular weight: {}".format(fn(tokens)),
+ postParse=lambda _, tokens: "Molecular weight: {}".format(
+ sum_atomic_weights_by_results_name_with_converted_ints(tokens)
+ ),
)
print()
diff --git a/examples/excelExpr.py b/examples/excelExpr.py index cea2eea..5c87d93 100644 --- a/examples/excelExpr.py +++ b/examples/excelExpr.py @@ -59,13 +59,15 @@ ifFunc = ( + RPAR
)
-statFunc = lambda name: Group(
- CaselessKeyword(name) + Group(LPAR + delimitedList(expr) + RPAR)
-)
-sumFunc = statFunc("sum")
-minFunc = statFunc("min")
-maxFunc = statFunc("max")
-aveFunc = statFunc("ave")
+
+def stat_function(name):
+ return Group(CaselessKeyword(name) + Group(LPAR + delimitedList(expr) + RPAR))
+
+
+sumFunc = stat_function("sum")
+minFunc = stat_function("min")
+maxFunc = stat_function("max")
+aveFunc = stat_function("ave")
funcCall = ifFunc | sumFunc | minFunc | maxFunc | aveFunc
multOp = oneOf("* /")
@@ -79,14 +81,14 @@ arithExpr = infixNotation( textOperand = dblQuotedString | cellRef
textExpr = infixNotation(textOperand, [("&", 2, opAssoc.LEFT),])
-expr << (arithExpr | textExpr)
+expr <<= (arithExpr | textExpr)
(EQ + expr).runTests(
"""\
=3*A7+5
=3*Sheet1!$A$7+5
- =3*'Sheet 1'!$A$7+5"
+ =3*'Sheet 1'!$A$7+5
=3*'O''Reilly''s sheet'!$A$7+5
=if(Sum(A1:A25)>42,Min(B1:B25),if(Sum(C1:C25)>3.14, (Min(C1:C25)+3)*18,Max(B1:B25)))
=sum(a1:a25,10,min(b1,c2,d3))
diff --git a/examples/fourFn.py b/examples/fourFn.py index 68441b8..e448fbb 100644 --- a/examples/fourFn.py +++ b/examples/fourFn.py @@ -79,8 +79,13 @@ def BNF(): expr = Forward() expr_list = delimitedList(Group(expr)) # add parse action that replaces the function identifier with a (name, number of args) tuple + def insert_fn_argcount_tuple(t): + fn = t.pop(0) + num_args = len(t[0]) + t.insert(0, (fn, num_args)) + fn_call = (ident + lpar - Group(expr_list) + rpar).setParseAction( - lambda t: t.insert(0, (t.pop(0), len(t[0]))) + insert_fn_argcount_tuple ) atom = ( addop[...] @@ -116,9 +121,14 @@ fn = { "tan": math.tan, "exp": math.exp, "abs": abs, - "trunc": lambda a: int(a), + "trunc": int, "round": round, "sgn": lambda a: -1 if a < -epsilon else 1 if a > epsilon else 0, + # functionsl with multiple arguments + "multiply": lambda a, b: a * b, + "hypot": math.hypot, + # functions with a variable number of arguments + "all": lambda *a: all(a), } @@ -211,6 +221,10 @@ if __name__ == "__main__": test("sgn(cos(PI*3/4))", -1) test("+(sgn(cos(PI/4)))", 1) test("-(sgn(cos(PI/4)))", -1) + test("hypot(3, 4)", 5) + test("multiply(3, 7)", 21) + test("all(1,1,1)", True) + test("all(1,1,1,1,1,0)", False) """ diff --git a/examples/holaMundo.py b/examples/holaMundo.py index 0589a0d..bb66ca2 100644 --- a/examples/holaMundo.py +++ b/examples/holaMundo.py @@ -55,8 +55,13 @@ numreal = Word(nums) numcomplex = numreal + "+" + numimag
print(numcomplex.parseString("3+5i"))
-# Cambiar a complejo numero durante parsear:
-numcomplex.setParseAction(lambda t: complex("".join(t).replace("i", "j")))
+# Funcion para cambiar a complejo numero durante parsear:
+def hace_python_complejo(t):
+ valid_python = "".join(t).replace("i", "j")
+ return complex(valid_python)
+
+
+numcomplex.setParseAction(hace_python_complejo)
print(numcomplex.parseString("3+5i"))
# Excelente!!, bueno, los dejo, me voy a seguir tirando código...
diff --git a/examples/htmlTableParser.py b/examples/htmlTableParser.py index e96a913..79b61d5 100644 --- a/examples/htmlTableParser.py +++ b/examples/htmlTableParser.py @@ -24,7 +24,13 @@ strip_html = (pp.anyOpenTag | pp.anyCloseTag).suppress().transformString # expression for parsing <a href="url">text</a> links, returning a (text, url) tuple link = pp.Group(a + a.tag_body("text") + a_end.suppress()) -link.addParseAction(lambda t: (t[0].text, t[0].href)) + + +def extract_text_and_url(t): + return (t[0].text, t[0].href) + + +link.addParseAction(extract_text_and_url) # method to create table rows of header and data tags def table_row(start_tag, end_tag): diff --git a/examples/list1.py b/examples/list1.py deleted file mode 100644 index 53673db..0000000 --- a/examples/list1.py +++ /dev/null @@ -1,60 +0,0 @@ -#
-# list1.py
-#
-# an example of using parse actions to convert type of parsed data.
-#
-# Copyright (c) 2006-2016, Paul McGuire
-#
-from pyparsing import *
-
-# first pass
-lbrack = Literal("[")
-rbrack = Literal("]")
-integer = Word(nums).setName("integer")
-real = Combine(
- Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))
-).setName("real")
-
-listItem = real | integer | quotedString
-
-listStr = lbrack + delimitedList(listItem) + rbrack
-
-test = "['a', 100, 3.14]"
-
-print(listStr.parseString(test))
-
-
-# second pass, cleanup and add converters
-lbrack = Literal("[").suppress()
-rbrack = Literal("]").suppress()
-cvtInt = lambda s, l, toks: int(toks[0])
-cvtReal = lambda s, l, toks: float(toks[0])
-integer = Word(nums).setName("integer").setParseAction(cvtInt)
-real = (
- Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums)))
- .setName("real")
- .setParseAction(cvtReal)
-)
-listItem = real | integer | quotedString.setParseAction(removeQuotes)
-
-listStr = lbrack + delimitedList(listItem) + rbrack
-
-test = "['a', 100, 3.14]"
-
-print(listStr.parseString(test))
-
-# third pass, add nested list support
-lbrack, rbrack = map(Suppress, "[]")
-
-cvtInt = tokenMap(int)
-cvtReal = tokenMap(float)
-
-integer = Word(nums).setName("integer").setParseAction(cvtInt)
-real = Regex(r"[+-]?\d+\.\d*").setName("real").setParseAction(cvtReal)
-
-listStr = Forward()
-listItem = real | integer | quotedString.setParseAction(removeQuotes) | Group(listStr)
-listStr << lbrack + delimitedList(listItem) + rbrack
-
-test = "['a', 100, 3.14, [ +2.718, 'xyzzy', -1.414] ]"
-print(listStr.parseString(test))
diff --git a/examples/parseListString.py b/examples/parseListString.py deleted file mode 100644 index f34f614..0000000 --- a/examples/parseListString.py +++ /dev/null @@ -1,112 +0,0 @@ -# parseListString.py
-#
-# Copyright, 2006, by Paul McGuire
-#
-
-from pyparsing import *
-
-# first pass
-lbrack = Literal("[")
-rbrack = Literal("]")
-integer = Word(nums).setName("integer")
-real = Combine(
- Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))
-).setName("real")
-
-listItem = real | integer | quotedString
-
-listStr = lbrack + delimitedList(listItem) + rbrack
-
-test = "['a', 100, 3.14]"
-
-print(listStr.parseString(test))
-
-
-# second pass, cleanup and add converters
-lbrack = Literal("[").suppress()
-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 = Regex(r"[+-]?\d+\.\d*").setName("floating-point number").setParseAction(cvtReal)
-listItem = real | integer | quotedString.setParseAction(removeQuotes)
-
-listStr = lbrack + delimitedList(listItem) + rbrack
-
-test = "['a', 100, 3.14]"
-
-print(listStr.parseString(test))
-
-# third pass, add nested list support, and tuples, too!
-cvtInt = lambda s, l, toks: int(toks[0])
-cvtReal = lambda s, l, toks: float(toks[0])
-
-lbrack = Literal("[").suppress()
-rbrack = Literal("]").suppress()
-integer = Word(nums).setName("integer").setParseAction(cvtInt)
-real = Regex(r"[+-]?\d+\.\d*").setName("floating-point number").setParseAction(cvtReal)
-tupleStr = Forward()
-listStr = Forward()
-listItem = (
- real
- | integer
- | quotedString.setParseAction(removeQuotes)
- | Group(listStr)
- | tupleStr
-)
-tupleStr << (
- Suppress("(") + delimitedList(listItem) + Optional(Suppress(",")) + Suppress(")")
-)
-tupleStr.setParseAction(lambda t: tuple(t.asList()))
-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, 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])
-
-lbrack = Literal("[").suppress()
-rbrack = Literal("]").suppress()
-lbrace = Literal("{").suppress()
-rbrace = Literal("}").suppress()
-colon = Literal(":").suppress()
-integer = Word(nums).setName("integer").setParseAction(cvtInt)
-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.setParseAction(lambda t: tuple(t.asList()))
-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: {
- 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))
diff --git a/examples/parsePythonValue.py b/examples/parsePythonValue.py index 6a75d48..47f9102 100644 --- a/examples/parsePythonValue.py +++ b/examples/parsePythonValue.py @@ -23,16 +23,16 @@ 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)) +unistr = pp.unicodeString().setParseAction(lambda t: t[0][2:-1]) +quoted_str = pp.quotedString().setParseAction(lambda t: t[0][1:-1]) +boolLiteral = pp.oneOf("True False", asKeyword=True).setParseAction(cvtBool) +noneLiteral = pp.Keyword("None").setParseAction(pp.replaceWith(None)) listItem = ( real | integer - | pp.quotedString - | pp.unicodeString + | quoted_str + | unistr | boolLiteral | noneLiteral | pp.Group(listStr) @@ -40,18 +40,18 @@ listItem = ( | dictStr ) -tupleStr << ( +tupleStr <<= ( lparen + pp.Optional(pp.delimitedList(listItem)) + pp.Optional(comma) + rparen ) tupleStr.setParseAction(cvtTuple) -listStr << ( +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 << ( +dictStr <<= ( lbrace + pp.Optional(pp.delimitedList(dictEntry) + pp.Optional(comma)) + rbrace ) dictStr.setParseAction(cvtDict) diff --git a/examples/shapes.py b/examples/shapes.py index 5f621b1..418ade2 100644 --- a/examples/shapes.py +++ b/examples/shapes.py @@ -35,7 +35,11 @@ class Circle(Shape): import pyparsing as pp -number = pp.Regex(r"-?\d+(\.\d*)?").setParseAction(lambda t: float(t[0])) +ppc = pp.pyparsing_common + +# use pyparsing-defined numeric expression that converts all parsed +# numeric values as floats +number = ppc.fnumber() # Shape expressions: # square : S <centerx> <centery> <side> diff --git a/examples/simpleArith.py b/examples/simpleArith.py index 4539018..476cb8b 100644 --- a/examples/simpleArith.py +++ b/examples/simpleArith.py @@ -9,10 +9,12 @@ import sys
from pyparsing import *
+ppc = pyparsing_common
+
ParserElement.enablePackrat()
sys.setrecursionlimit(3000)
-integer = Word(nums).setParseAction(lambda t: int(t[0]))
+integer = ppc.integer
variable = Word(alphas, exact=1)
operand = integer | variable
diff --git a/examples/stackish.py b/examples/stackish.py index f02baf3..436a9ea 100644 --- a/examples/stackish.py +++ b/examples/stackish.py @@ -42,15 +42,14 @@ from pyparsing import ( Group,
ZeroOrMore,
srange,
+ pyparsing_common as ppc,
)
MARK, UNMARK, AT, COLON, QUOTE = map(Suppress, "[]@:'")
-NUMBER = Word(nums)
-NUMBER.setParseAction(lambda t: int(t[0]))
-FLOAT = Combine(oneOf("+ -") + Word(nums) + "." + Optional(Word(nums)))
-FLOAT.setParseAction(lambda t: float(t[0]))
-STRING = QuotedString('"', multiline=True)
+NUMBER = ppc.integer()
+FLOAT = ppc.real()
+STRING = QuotedString('"', multiline=True) | QuotedString("'", multiline=True)
WORD = Word(alphas, alphanums + "_:")
ATTRIBUTE = Combine(AT + WORD)
@@ -87,18 +86,14 @@ GROUP = ( )
+ (WORD("name") | UNMARK)
).setParseAction(assignUsing("name"))
-item << (NUMBER | FLOAT | STRING | BLOB | GROUP)
-
-tests = """\
-[ '10:1234567890' @name 25 @age +0.45 @percentage person:zed
-[ [ "hello" 1 child root
-[ "child" [ 200 '4:like' "I" "hello" things root
-[ [ "data" [ 2 1 ] @numbers child root
-[ [ 1 2 3 ] @test 4 5 6 root
-""".splitlines()
-
-for test in tests:
- if test:
- print(test)
- print(item.parseString(test).dump())
- print()
+item <<= FLOAT | NUMBER | STRING | BLOB | GROUP
+
+item.runTests(
+ """\
+ [ '10:1234567890' @name 25 @age +0.45 @percentage person:zed
+ [ [ "hello" 1 child root
+ [ "child" [ 200 '4:like' "I" "hello" things root
+ [ [ "data" [ 2 1 ] @numbers child root
+ [ [ 1 2 3 ] @test 4 5 6 root
+ """
+)
|