4 from pyparsing
import *
7 params = params
or dict()
9 TRUE = CaselessKeyword(
"true").setParseAction(
lambda m:
True)
10 FALSE = CaselessKeyword(
"false").setParseAction(
lambda m:
False)
11 boolean = TRUE | FALSE
13 param = Word(alphas +
"_", alphanums +
'_').setParseAction(
lambda m:params[m[0]])
14 sstring = QuotedString(
'"').setName(
"stringliteral")
15 dstring = QuotedString(
"'").setName(
"stringliteral")
16 string = sstring | dstring
17 integer = Word(nums).setParseAction(
lambda m:int(m[0]))
19 ops =
">= <= != > < = == + - * / | & " 20 ops +=
"ge le ne gt lt eq add sub mul div or and" 21 operator = oneOf(ops).setName(
"operator")
22 atom = boolean | string | integer | operator | param
27 func = Group( lp + ZeroOrMore(sexp) + rp )
28 sexp << ( atom | func )
34 print (one,
type(one), dir(one))
38 params = dict(a=3,b=2,name=
"Manfred")
43 pr = sp.parseString(
"undefined")
47 raise RuntimeError(
"should have gotten an KeyError on 'undefined'")
50 for want, toparse
in [
55 (
True,
"(or (= a 5) (= b 2))"),
56 (
True,
"(or (= a 5) (= b 2))"),
57 (
True,
"(and (eq name 'Manfred') (eq b 2))"),
58 (
True,
"(and (= name 'Manfred') (or (= a 5) (= b 2)))"),
59 (
True,
"(== a (+ 1 b))"),
60 (
False,
'(== name "Ada")'),
61 (
True,
'(== name "Manfred")'),
62 (
True,
"(== name 'Manfred')"),
63 (
True,
'(!= name "Ada")'),
64 (
False,
'(!= name "Manfred")'),
66 (
True,
'(| (< a b) (> a b))'),
67 (
True,
'(& (= a 3) (= 2 b))'),
68 (
True,
'(and (== a 3) (eq 2 b))'),
69 (
True,
'(!= name "name")'),
72 pr = sp.parseString(toparse, parseAll=
True)
76 print (
"parsed:",
type(pr), pr)
77 if isinstance(pr, ParseResults):
78 r = rule.Rule(pr, return_bool=
True)
81 print (f
'Rule result: "{toparse}" on {params} gives {result}')
83 result =
True if pr
else False 84 print (f
'Literal result: "{toparse}" on {params} gives {result}')
86 assert(want == result)
90 if '__main__' == __name__: