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__: