|
- #
- # This example shows how to write a basic calculator with variables.
- #
-
- from lark import Lark, InlineTransformer
-
- try:
- input = raw_input # For Python2 compatibility
- except NameError:
- pass
-
-
- calc_grammar = """
- ?start: sum
- | NAME "=" sum -> assign_var
-
- ?sum: product
- | sum "+" product -> add
- | sum "-" product -> sub
-
- ?product: atom
- | product "*" atom -> mul
- | product "/" atom -> div
-
- ?atom: NUMBER -> number
- | "-" atom -> neg
- | NAME -> var
- | "(" sum ")"
-
- %import common.CNAME -> NAME
- %import common.NUMBER
- %import common.WS_INLINE
-
- %ignore WS_INLINE
- """
-
- class CalculateTree(InlineTransformer):
- from operator import add, sub, mul, truediv as div, neg
- number = float
-
- def __init__(self):
- self.vars = {}
-
- def assign_var(self, name, value):
- self.vars[name] = value
- return value
-
- def var(self, name):
- return self.vars[name]
-
-
-
- calc_parser = Lark(calc_grammar, parser='lalr', transformer=CalculateTree())
- calc = calc_parser.parse
-
- def main():
- while True:
- try:
- s = input('> ')
- except EOFError:
- break
- print(calc(s))
-
- def test():
- print(calc("a = 1+2"))
- print(calc("1+a*-3"))
-
- if __name__ == '__main__':
- # test()
- main()
|