Browse Source

Added examples (calc, json)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.5.1
Erez Shinan 7 years ago
parent
commit
77d8963bf7
3 changed files with 124 additions and 0 deletions
  1. +0
    -0
      examples/__init__.py
  2. +60
    -0
      examples/calc.py
  3. +64
    -0
      examples/json_example.py

+ 0
- 0
examples/__init__.py View File


+ 60
- 0
examples/calc.py View File

@@ -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()


+ 64
- 0
examples/json_example.py View File

@@ -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 : /".*?(?<!\\)"/

WS.ignore.newline: /[ \t\n]+/
"""

class TreeToJson(Transformer):
@inline_args
def string(self, s):
return s[1:-1]

array = list
pair = tuple
object = dict
number = inline_args(float)

null = lambda self, _: None
true = lambda self, _: True
false = lambda self, _: False

json_parser = Lark(json_grammar, parser='lalr', transformer=TreeToJson())
parse = json_parser.parse

def test():
test_json = '''
{
"empty_object" : {},
"empty_array" : [],
"booleans" : { "YES" : true, "NO" : false },
"numbers" : [ 0, 1, -2, 3.3, 4.4e5, 6.6e-7 ],
"strings" : [ "This", [ "And" , "That" ] ],
"nothing" : null
}
'''

j = parse(test_json)
print j
import json
assert j == json.loads(test_json)

if __name__ == '__main__':
test()
with open(sys.argv[1]) as f:
print parse(f.read())


Loading…
Cancel
Save