-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathutilities.py
63 lines (50 loc) · 1.53 KB
/
utilities.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
# -*- coding: utf-8 -*-
from antlr4.tree.Trees import Trees
from antlr4.Utils import escapeWhitespace
import pydot, io
# Treelist is modified as [node_name, subtrees]
index = 0 # index number of the tree
class TreeList(Trees):
def __init__(self, *args, **kargs):
super(TreeList, self).__init__(*args, **kargs)
@classmethod
def toStringTreeList(cls, t, ruleNames=None, recog=None):
# from a tree to a list of names
if recog is not None:
ruleNames = recog.ruleNames
s = escapeWhitespace(cls.getNodeText(t, ruleNames), False)
lis = [s, None]
if t.getChildCount() == 0:
return lis
lis[1] = []
for i in range(t.getChildCount()):
lis[1].append(cls.toStringTreeList(t.getChild(i), ruleNames))
return lis
def print_tree_parent(treelist, buf, parent_name=''):
global index
node_name = 'Num.' + str(index)
if parent_name == '':
buf.write(node_name + ';\n')
else:
buf.write(parent_name + '->' + node_name + ';\n')
# set the label name
index += 1
buf.write(node_name + ' [label="%s"] ;\n' % treelist[0])
if treelist[1] != None and treelist[1] != []:
for subtree in treelist[1]:
print_tree_parent(subtree, buf, node_name) # recursive
else:
return
def draw_tree_node(treelist, label=''):
string = 'graph "' + label + '"{'
global index
index = 0
buf = io.StringIO()
print_tree_parent(treelist, buf)
mid = buf.getvalue()
string += mid + '}'
buf.close()
return string
def draw_pic(treelist, out_name=''):
node = draw_tree_node(treelist, out_name)
pydot.graph_from_dot_data(node)[0].write_png(out_name + ".png")