Guest User

Untitled

a guest
Feb 20th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. from pyparsing import *
  2.  
  3. def buildVar(s, l, t):
  4.  
  5. return [["id", t[0][0]]]
  6.  
  7. def buildExpr(s, l, t):
  8.  
  9. e = t[0]
  10.  
  11. if e[1] == "+":
  12. return [["add", e[0], e[2]]]
  13. elif e[1] == "-":
  14. return [["sub", e[0], e[2]]]
  15. elif e[1] == "*":
  16. return [["mul", e[0], e[2]]]
  17. elif e[1] == "/":
  18. return [["div", e[0], e[2]]]
  19. else:
  20. raise Exception("Unknown expression:", t)
  21.  
  22. integer = Combine(Optional(oneOf("+ -")) + Word(nums)).setParseAction(buildVar)
  23.  
  24. mulOp = oneOf("* /")
  25. addOp = oneOf("+ -")
  26. lpar = Literal("(").suppress()
  27. rpar = Literal(")").suppress()
  28.  
  29.  
  30. def evalExpr(e):
  31.  
  32. op = e[0]
  33.  
  34. if op == "id":
  35. return int(e[1])
  36. elif op == "add":
  37. return evalExpr(e[1]) + evalExpr(e[2])
  38. elif op == "sub":
  39. return evalExpr(e[1]) - evalExpr(e[2])
  40. elif op == "mul":
  41. return evalExpr(e[1]) * evalExpr(e[2])
  42. elif op == "div":
  43. return evalExpr(e[1]) / evalExpr(e[2])
  44. else:
  45. raise Exception("Unknown expression:", e)
  46.  
  47.  
  48. expr = operatorPrecedence(integer,
  49. [ (mulOp, 2, opAssoc.LEFT, buildExpr)
  50. , (addOp, 2, opAssoc.LEFT, buildExpr)
  51. ]
  52. )
  53.  
  54. program = expr + StringEnd()
  55.  
  56. try:
  57. input = "(4+3)*7+9"
  58. print "input =", input
  59. e = program.parseString(input)
  60. print "AST =", e
  61. print "eval =", evalExpr(e[0])
  62.  
  63. print ""
  64. input = "(4+3)*a" # expects parse err
  65. print "input =", input
  66. e = program.parseString(input)
  67. print "AST =", e
  68. print "eval =", evalExpr(e[0])
  69.  
  70. except ParseException, err:
  71. print err.line
  72. print " "*(err.column-1) + "^"
  73. print err
Add Comment
Please, Sign In to add comment