From 77d8963bf756089dd45386668c050eadfb13631a Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Sun, 5 Feb 2017 13:40:19 +0200 Subject: [PATCH] Added examples (calc, json) --- examples/__init__.py | 0 examples/calc.py | 60 +++++++++++++++++++++++++++++++++++++ examples/json_example.py | 64 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 examples/__init__.py create mode 100644 examples/calc.py create mode 100644 examples/json_example.py diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/calc.py b/examples/calc.py new file mode 100644 index 0000000..bebb5a0 --- /dev/null +++ b/examples/calc.py @@ -0,0 +1,60 @@ +from lark.tree import InlineTransformer +from lark.lark import Lark + +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: /[\d.]+/ -> number + | "-" atom -> neg + | NAME -> var + | "(" sum ")" + + NAME: /\w+/ + WS.ignore: /\s+/ +""" + +class CalculateTree(InlineTransformer): + from operator import add, sub, mul, 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 = raw_input('> ') + except EOFError: + break + print(calc(s)) + +def test(): + # print calc("a=(1+2)") + print calc("a = 1+2") + print calc("1+a*-3") + +if __name__ == '__main__': + test() + # main() + diff --git a/examples/json_example.py b/examples/json_example.py new file mode 100644 index 0000000..485ea52 --- /dev/null +++ b/examples/json_example.py @@ -0,0 +1,64 @@ +import sys +from lark.lark import Lark, inline_args +from lark.tree import Transformer + +json_grammar = r""" + ?start: value + + ?value: object + | array + | string + | number + | "true" -> true + | "false" -> false + | "null" -> null + + array : "[" [value ("," value)*] "]" + object : "{" [pair ("," pair)*] "}" + pair : string ":" value + + number : /-?\d+(\.\d+)?([eE][+-]?\d+)?/ + string : /".*?(?