Created
August 20, 2020 06:03
-
-
Save waynezhang/1b36acbef0f51fe23ec442017ed5deca to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! 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