LARK Introduction to Parsing - uchicago-cs/chiventure GitHub Wiki
Lark is the parsing tool used by the domain specific language team to enable algorithmic, grammar based conversion of dsl files, which are largely written in plaintext, to a WDL++.
from lark import Lark, Transformer, v_args
try:
input = raw_input
except NameError:
pass
my_grammar_calc = """
%import common.CNAME -> NAME
%import common.NUMBER
%import common.WS_INLINE
%ignore WS_INLINE
?start: value -> number
?value: add
| SIGNED_NUMBER -> assign_var
?add: sub
| add "+" sub -> add
?sub: mult
| sub "-" mult -> sub
?mult: div
| mult "*" div -> mul
?div: neg
| div "/" neg -> div
?neg: parenth
| "-" parenth -> neg
?parenth: value
|"(" value ")"
"""
@v_args(inline = True)
class my_calc_tree(Transformer):
from operator import add, sub, mul, truediv as div, neg
number = float
def __init__(self):
self.vars = {}
def assign_var(self, nm, val):
self.vars[name] = val
parse_my_calc = Lark(my_grammar_calc, parser = 'lalr', transformer=my_calc_tree())
calculator = parse_my_calc.parse
def test():
print(calculator("a = 3+4"));
print(calculator("a = 3/4"));
print(calculator("a = 3*4"));
print(calculator("a = 3-4"));
test()