Skip to content

Instantly share code, notes, and snippets.

@waynezhang
Created August 20, 2020 06:03
Show Gist options
  • Save waynezhang/1b36acbef0f51fe23ec442017ed5deca to your computer and use it in GitHub Desktop.
Save waynezhang/1b36acbef0f51fe23ec442017ed5deca to your computer and use it in GitHub Desktop.
#! env python3
from lark import Lark
from lark import Transformer
import json
lark = Lark('''
?start: (macro | expr)*
?parameter: dict
| string
| list
?list: "[" [ string ("," string)* (",")* ] "]"
?dict: pair ["," pair [","] ]
?macro: name "(" ( parameter ("," parameter)* (",")* )* ")"
?pair: name "=" (string | list | name)
?expr: name "=" string
name: CNAME
string: ESCAPED_STRING | LONG_STRING
LONG_STRING: /""".*?"""/is
COMMENT: /#[^\r]*/
%import common.ESCAPED_STRING
%import common.WORD
%import common.CNAME
%import common.WS
%ignore WS
%ignore COMMENT
''')
class TreeToJson(Transformer):
def start(self, v):
return v
def name(self, n):
(n,) = n
return n[0:]
def string(self, s):
(s,) = s
return s[1:-1]
def macro(self, m):
k = m[0]
v = m[1:]
list = [ ]
flattened = { }
for e in v:
if type(e) is dict:
for k, v in e.items():
flattened[k] = v
else:
list.append(e)
if len(list) == 0:
return { m[0]: flattened }
elif len(flattened) == 0:
return { m[0]: list }
else:
list.append(flattened)
return { m[0]: list }
def pair(self, p):
return { p[0]: p[1] }
def dict(self, d):
dict = {}
for p in d:
for k, v in p.items():
dict[k] = v
return dict
def expr(self, e):
return { e[0]: e[1] }
list = list
def parse():
with open('WORKSPACE', 'r') as f:
str = f.read()
tree = lark.parse(str)
transformed = TreeToJson().transform(tree)
print(json.dumps(transformed, indent=4, sort_keys=True))
if __name__ == "__main__":
parse()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment