File: nodetree.py

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,113,256 kB
  • sloc: ansic: 40,697; python: 25,137; yacc: 8,438; sh: 5,405; javascript: 4,596; lex: 1,632; cpp: 742; perl: 296; lisp: 273; makefile: 226; fortran: 132
file content (61 lines) | stat: -rw-r--r-- 1,919 bytes parent folder | download
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
'''
Implementation of classes involved in Python object construction from parsed mcdisplay --trace output.
'''
class Node(object):
    '''
    Node objects are used to construct the trace parse tree.
    '''
    def __init__(self, type, children=None, leaf=None):
        self.type = type
        if children:
            self.children = children
        else:
            self.children = []
        self.leaf = leaf
    def __str__(self):
        return 'type: %s, leaf: %s, numchildren: %s' % (self.type, str(self.leaf), str(len(self.children)))

class NodeTreePrint(object):
    '''
    Functional-ish programming implementation of node tree operation: iteratively print nodes 
    in human readable form.
    
    Node tree assumptions: children is a list of Node's, leaf is for data
    Does not print any rays by default, enable by using printrays=True during construction.
    '''
    rootnode = None
    def __init__(self, rootnode):
        self.rootnode = rootnode
        self.print_tree()
    
    def print_tree(self):
        self.level = 0
        self.recurse(self.rootnode, self.printfunc, self.inclevel, self.declevel, self.getlevel)
    
    def getlevel(self):
        return self.level
    
    def inclevel(self):
        self.level += 1
    
    def declevel(self):
        self.level -= 1
    
    @staticmethod
    def printfunc(node, level):
        fs = '{:>' + str(level*4) + '}' # e.g. '{:<16}'
        type = node.type
        leaf = ''
        if node.leaf:
            leaf = node.leaf
        print(fs.format('') + '%s: %s' % (type, leaf))
    
    @staticmethod
    def recurse(node, printfunc, inclevel, declevel, getlevel):
        for c in node.children:
            level = getlevel()
            printfunc(c, level)
            if len(c.children) > 0:
                inclevel()
                NodeTreePrint.recurse(c, printfunc, inclevel, declevel, getlevel)
        declevel()