Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.64 KB | None | 0 0
  1. from pyparsing import *
  2. from base64 import b64decode
  3. import pprint
  4. import math
  5. import statistics
  6. import sys
  7.  
  8. #
  9. # Code for parsing s expressions (not mine)
  10. #
  11. # Copyright 2007-2011, by Paul McGuire
  12. #
  13.  
  14. def verifyLen(s,l,t):
  15. t = t[0]
  16. if t.len is not None:
  17. t1len = len(t[1])
  18. if t1len != t.len:
  19. raise ParseFatalException(s,l,\
  20. "invalid data of length %d, expected %s" % (t1len, t.len))
  21. return t[1]
  22.  
  23. # define punctuation literals
  24. LPAR, RPAR, LBRK, RBRK, LBRC, RBRC, VBAR = map(Suppress, "()[]{}|")
  25.  
  26. decimal = Regex(r'0|[1-9]\d*').setParseAction(lambda t: int(t[0]))
  27. hexadecimal = ("#" + OneOrMore(Word(hexnums)) + "#")\
  28. .setParseAction(lambda t: int("".join(t[1:-1]),16))
  29. bytes = Word(printables)
  30. raw = Group(decimal("len") + Suppress(":") + bytes).setParseAction(verifyLen)
  31. token = Word(alphanums + "-./_:*+=")
  32. base64_ = Group(Optional(decimal|hexadecimal,default=None)("len") + VBAR
  33. + OneOrMore(Word( alphanums +"+/=" )).setParseAction(lambda t: b64decode("".join(t)))
  34. + VBAR).setParseAction(verifyLen)
  35.  
  36. qString = Group(Optional(decimal,default=None)("len") +
  37. dblQuotedString.setParseAction(removeQuotes)).setParseAction(verifyLen)
  38. simpleString = base64_ | raw | decimal | token | hexadecimal | qString
  39.  
  40. # extended definitions
  41. decimal = Regex(r'-?0|[1-9]\d*').setParseAction(lambda t: int(t[0]))
  42. real = Regex(r"[+-]?\d+\.\d*([eE][+-]?\d+)?").setParseAction(lambda tokens: float(tokens[0]))
  43. token = Word(alphanums + "-./_:*+=!<>")
  44.  
  45. simpleString = (real | base64_ | raw | decimal | token | hexadecimal | qString)
  46.  
  47. display = LBRK + simpleString + RBRK
  48. string_ = Optional(display) + simpleString
  49.  
  50. sexp = Forward()
  51. sexpList = Group(LPAR + ZeroOrMore(sexp) + RPAR)
  52. sexp << ( string_ | sexpList )
  53.  
  54. test = "(add 20 5)"
  55. input = "(mul (add 1 2) (log 8))"
  56. input2 = "(max (data 0) (data 1))"
  57.  
  58. data = [1.0, 2.0]
  59. n = 2
  60.  
  61.  
  62. ## My code ##
  63. def doexpr(expr):
  64. if isinstance(expr, list):
  65. head = expr[0]
  66. tail = expr[1:]
  67. if (type(head) == str):
  68. if (head == "add"):
  69. return doexpr(tail[0]) + doexpr(tail[1])
  70. elif (head == "sub"):
  71. return doexpr(tail[0]) - doexpr(tail[1])
  72. elif (head == "mul"):
  73. return doexpr(tail[0]) * doexpr(tail[1])
  74. elif (head == "div"):
  75. if (doexpr(tail[1]) == 0):
  76. return 0
  77. else:
  78. return doexpr(tail[0]) / doexpr(tail[1])
  79. elif (head == "pow"):
  80. if (tail[0] < 0 and tail[1] % 1 != 0)
  81. return 0
  82. else:
  83. return doexpr(tail[0]) ** doexpr(tail[1])
  84. elif (head == "sqrt"):
  85. if doexpr(tail[0]) < 0:
  86. return 0
  87. else:
  88. return math.sqrt(doexpr(tail[0]))
  89. elif (head == "log"):
  90. if (doexpr(tail[0]) <= 0):
  91. return 0
  92. else:
  93. return math.log(doexpr(tail[0]), 2)
  94. elif (head == "exp"):
  95. return math.exp(doexpr(tail[0]))
  96. elif (head == "max"):
  97. return max(doexpr(tail[0]), doexpr(tail[1]))
  98. elif (head == "ifleq"):
  99. if (doexpr(tail[0]) <= doexpr(tail[1])):
  100. return doexpr(tail[2])
  101. else:
  102. return doexpr(tail[3])
  103. elif (head == "data"):
  104. return data[int(abs(math.floor(doexpr(tail[0]))) % n)]
  105. elif (head == "diff"):
  106. return data[int(abs(math.floor(doexpr(tail[0]))) % n)] - data[int(abs(math.floor(doexpr(tail[1]))) % n)]
  107. elif (head == "avg"):
  108. idx0 = int(abs(math.floor(doexpr(tail[0]))) % n)
  109. idx1 = int(abs(math.floor(doexpr(tail[1]))) % n)
  110. if (idx0 != idx1):
  111. sset = data[min(idx0,idx1):max(idx0,idx1)]
  112. return statistics.mean(sset)
  113. else:
  114. return 0
  115. else:
  116. sys.exit("Bad input at: %s" % expr)
  117. elif (type(head) == list):
  118. return doexpr(head)
  119. elif (type(head) == int or type(head) == float):
  120. return head
  121. else:
  122. sys.exit("malformed expression")
  123. elif (type(expr) == int or type(expr) == float):
  124. return expr
  125. else:
  126. sys.exit("malformed expression")
  127.  
  128. if (len(sys.argv) < 9):
  129. sys.exit("bad argument format")
  130. for i in range(9):
  131. if (sys.argv[i] == "-question"):
  132. question = int(sys.argv[i+1])
  133. if (question < 1 or question > 5):
  134. print ("was expecting value between 1 and 5, but got: %d" % question)
  135. sys.exit("bad question number")
  136. if (sys.argv[i] == "-n"):
  137. n = int(sys.argv[i+1])
  138. if (n < 1):
  139. print ("was expecting value greater than 0, but got: %d" % n)
  140. sys.exit("bad dimension n")
  141. if (sys.argv[i] == "-x"):
  142. data = sys.argv[i+1].split(" ")
  143. for j in range(len(data)):
  144. data[j] = float(data[j])
  145. if (len(data) != n):
  146. print ("was expecting input data of length: %d, but was length: %d" % (n, len(data)))
  147. sys.exit("data dimension mismatch")
  148. if (sys.argv[i] == "-expr"):
  149. inputexpr = sys.argv[i+1]
  150.  
  151. if (question is None
  152. or n is None
  153. or data is None
  154. or inputexpr is None):
  155. sys.exit("Not all arguments specified")
  156.  
  157. sexpr = sexp.parseString(inputexpr, parseAll=True).asList()
  158. print(doexpr(sexpr))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement