This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

60 rindas
1.2 KiB

  1. from lark import Lark, InlineTransformer
  2. calc_grammar = """
  3. ?start: sum
  4. | NAME "=" sum -> assign_var
  5. ?sum: product
  6. | sum "+" product -> add
  7. | sum "-" product -> sub
  8. ?product: atom
  9. | product "*" atom -> mul
  10. | product "/" atom -> div
  11. ?atom: /[\d.]+/ -> number
  12. | "-" atom -> neg
  13. | NAME -> var
  14. | "(" sum ")"
  15. NAME: /[a-zA-Z]\w*/
  16. WS.ignore: /\s+/
  17. """
  18. class CalculateTree(InlineTransformer):
  19. from operator import add, sub, mul, truediv as div, neg
  20. number = float
  21. def __init__(self):
  22. self.vars = {}
  23. def assign_var(self, name, value):
  24. self.vars[name] = value
  25. return value
  26. def var(self, name):
  27. return self.vars[name]
  28. calc_parser = Lark(calc_grammar, parser='lalr', transformer=CalculateTree())
  29. calc = calc_parser.parse
  30. def main():
  31. while True:
  32. try:
  33. s = raw_input('> ')
  34. except EOFError:
  35. break
  36. print(calc(s))
  37. def test():
  38. # print calc("a=(1+2)")
  39. print(calc("a = 1+2"))
  40. print(calc("1+a*-3"))
  41. if __name__ == '__main__':
  42. test()
  43. # main()