/
parser.py
85 lines (63 loc) · 1.65 KB
/
parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from lark import Lark
from lark import Transformer
from pprint import pprint
from sys import stdin
_grammar = """
?start: keyvalue*
?block: "{" keyvalue* "}"
?value: anytext NEWLINE | block
?anytext: /.+/*
?keyvalue: NAME "=" value
?quote: "\\""
%import common.CNAME -> NAME
%import common.NUMBER -> NUM
%import common.WS
%import common.ESCAPED_STRING
%import common._STRING_ESC_INNER
%import common.NEWLINE
%ignore WS
"""
class _WpaSupplicantTransformer(Transformer):
def NAME(self, node):
return str(node)
def start(self, nodes):
networks = {}
props = {}
for node in nodes:
if node[0] == "network":
networks[node[1]["ssid"]] = node[1]
del node[1]["ssid"]
continue
props[node[0]] = node[1]
return {
"networks": networks,
"props": props
}
def value(self, node):
ret = str(node[0]).strip("\"")
try:
return int(ret)
except ValueError:
return ret
def keyvalue(self, node):
return (str(node[0]), node[1])
def block(self, block):
props = {}
for k, v in block:
props[k] = v
return props
class WpaSupplicantParser(Lark):
def __init__(self):
super(WpaSupplicantParser, self).__init__(
_grammar, parser='lalr',
transformer=_WpaSupplicantTransformer()
)
def parse(text: str):
p = WpaSupplicantParser()
return p.parse(text)
def main():
f = stdin.read()
res = parse(f)
pprint(res)
if __name__ == "__main__":
main()