~ubuntu-branches/ubuntu/precise/pyparsing/precise-updates

« back to all changes in this revision

Viewing changes to docs/examples/simpleArith.py

  • Committer: Bazaar Package Importer
  • Author(s): Kevin Coyner
  • Date: 2008-02-24 18:14:15 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20080224181415-9x0hjya3ca3590z1
Tags: 1.4.11-2
Reinstate release 1.4.10-2 changes, which I inadvertently omitted.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#
2
 
# simpleArith.py
3
 
#
4
 
# Example of defining an arithmetic expression parser using
5
 
# the operatorPrecedence helper method in pyparsing.
6
 
#
7
 
# Copyright 2006, by Paul McGuire
8
 
#
9
 
 
10
 
from pyparsing import *
11
 
 
12
 
integer = Word(nums).setParseAction(lambda t:int(t[0]))
13
 
variable = Word(alphas,exact=1)
14
 
operand = integer | variable
15
 
 
16
 
expop = Literal('^')
17
 
signop = oneOf('+ -')
18
 
multop = oneOf('* /')
19
 
plusop = oneOf('+ -')
20
 
factop = Literal('!')
21
 
 
22
 
# To use the operatorPrecedence helper:
23
 
#   1.  Define the "atom" operand term of the grammar.
24
 
#       For this simple grammar, the smallest operand is either
25
 
#       and integer or a variable.  This will be the first argument
26
 
#       to the operatorPrecedence method.
27
 
#   2.  Define a list of tuples for each level of operator
28
 
#       precendence.  Each tuple is of the form
29
 
#       (opExpr, numTerms, rightLeftAssoc, parseAction), where
30
 
#       - opExpr is the pyparsing expression for the operator;
31
 
#          may also be a string, which will be converted to a Literal
32
 
#       - numTerms is the number of terms for this operator (must
33
 
#          be 1 or 2)
34
 
#       - rightLeftAssoc is the indicator whether the operator is
35
 
#          right or left associative, using the pyparsing-defined
36
 
#          constants opAssoc.RIGHT and opAssoc.LEFT.
37
 
#       - parseAction is the parse action to be associated with 
38
 
#          expressions matching this operator expression (the
39
 
#          parse action tuple member may be omitted)
40
 
#   3.  Call operatorPrecedence passing the operand expression and
41
 
#       the operator precedence list, and save the returned value
42
 
#       as the generated pyparsing expression.  You can then use
43
 
#       this expression to parse input strings, or incorporate it
44
 
#       into a larger, more complex grammar.
45
 
#       
46
 
expr = operatorPrecedence( operand,
47
 
    [("!", 1, opAssoc.LEFT),
48
 
     ("^", 2, opAssoc.RIGHT),
49
 
     (signop, 1, opAssoc.RIGHT),
50
 
     (multop, 2, opAssoc.LEFT),
51
 
     (plusop, 2, opAssoc.LEFT),]
52
 
    )
53
 
 
54
 
test = ["9 + 2 + 3",
55
 
        "9 + 2 * 3",
56
 
        "(9 + 2) * 3",
57
 
        "(9 + -2) * 3",
58
 
        "(9 + -2) * 3^2^2",
59
 
        "(9! + -2) * 3^2^2",
60
 
        "M*X + B",
61
 
        "M*(X + B)",
62
 
        "1+2*-3^4*5+-+-6",]
63
 
for t in test:
64
 
    print t
65
 
    print expr.parseString(t)
66
 
    print 
67