-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathparse_tap.py
59 lines (50 loc) · 1.41 KB
/
parse_tap.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
import json
def json_to_display (j):
if type (j) == list:
return map (json_to_display, j)
elif 'name' in j:
return tuple ([j['name']] + json_to_display (j['args']))
else:
assert 'isTuple' in j
return tuple ([None] + json_to_display (j['elements']))
def parse_output (fname, lang = 'clos'):
f = open (fname)
header = 'tap.' + lang
while header not in f.readline ():
pass
for l in f:
l = l.strip ()
if l:
break
j = json.loads (l)
return json_to_display (j['prog'])
def arrange_display (display, indent = 0, margin = 80):
if type (display) == list:
head = '['
tail = '],'
ds = display
else:
head = '%s (' % display[0]
tail = '),'
ds = display[1:]
xs = [arrange_display (d, indent + 2, margin) for d in ds]
multi = [x for x in xs if len (x) > 1]
line_len = sum ([len (x[0][1]) + 1 for x in xs]
+ [indent, len (head), len (tail)])
if multi or line_len > margin:
return [(indent, head)] + [y for x in xs for y in x] + [(indent, tail)]
else:
return [(indent, head + ' '.join ([x[0][1] for x in xs]) + tail)]
def print_display (display, indent = 0, margin = 80):
for (indent, s) in arrange_display (display):
print (' ' * indent + s)
def main ():
import sys
fname = sys.argv[1]
if len (sys.argv) > 2:
lang = sys.argv[2]
else:
lang = 'clos'
print_display (parse_output (fname, lang))
if __name__ == '__main__':
main ()