1#!/usr/local/bin/python3.8
2
3
4import common
5import lexer
6
7import sys
8
9class _GenericTest(object):
10    def __init__(my, prefix, name):
11        my.name = name
12        my.prefix = prefix
13
14    def emitCodeTo_(my, channel):
15        channel.write("    %s%s();\n" % (my.prefix, my.name))
16
17    def emitExternTo_(my, channel):
18        channel.write("extern void %s%s(void);\n" % (my.prefix, my.name))
19
20
21class _GenericContext(_GenericTest):
22    def emitExternTo_(my, channel):
23        super(_GenericContext, my).emitExternTo_(channel)
24        channel.write("extern void __CUT_TAKEDOWN__%s(void);\n" % my.name)
25
26
27class Test(_GenericTest):
28    def __init__(self, name):
29        super(Test, self).__init__("__CUT__", name)
30
31    def __repr__(my):
32        return "Test(\"%s\")" % my.name
33
34
35
36class Bringup(_GenericContext):
37    def __init__(my, name, children):
38        super(Bringup, my).__init__("__CUT_BRINGUP__", name)
39        my.children = children
40
41    def childrenRepr(my):
42        reps = map(lambda x: x.__repr__(), my.children)
43        return ", ".join(reps)
44
45    def __repr__(my):
46        return "Bringup(\"%s\", [%s])" % (my.name, my.childrenRepr())
47
48    def emitExternTo_(my, channel):
49        super(Bringup, my).emitExternTo_(channel)
50        for c in my.children:
51            c.emitExternTo_(channel)
52
53    def emitCodeTo_(my, channel):
54        channel.write("    %s%s();\n" % (my.prefix, my.name))
55        for c in my.children:
56            c.emitCodeTo_(channel)
57        channel.write("    __CUT_TAKEDOWN__%s();\n" % my.name)
58
59
60class Setup(_GenericContext):
61    def __init__(my, name, children):
62        super(Setup, my).__init__("__CUT_SETUP__", name)
63        my.children = children
64
65    def childrenRepr(my):
66        reps = map(lambda x: x.__repr__(), my.children)
67        return ", ".join(reps)
68
69    def __repr__(my):
70        return "Setup(\"%s\", [%s])" % (my.name, my.childrenRepr())
71
72    def emitExternTo_(my, channel):
73        super(Setup, my).emitExternTo_(channel)
74        for c in my.children:
75            c.emitExternTo_(channel)
76
77    def emitCodeTo_(my, channel):
78        for c in my.children:
79            channel.write("    %s%s();\n" % (my.prefix, my.name))
80            c.emitCodeTo_(channel);
81            channel.write("    __CUT_TAKEDOWN__%s();\n" % my.name)
82
83
84def parseUsingLexer(l, tree):
85    assert(common.typeOf(l) == "Lexer")
86    assert(common.typeOf(tree) == "list")
87
88    while l.token != None:
89        length = len(l.token)
90        if (length < 6) or (l.token[0:6] != "__CUT_"):
91            l.next()
92        else:
93            if (length > 7) and (l.token[6] == '_'):
94                name = l.token[7:]
95                l.next()
96                if l.token == '(':
97                    l.next()
98                    tree.append(Test(name))
99
100            elif (length > 16) and (l.token[6:15] == 'BRINGUP__'):
101                name = l.token[15:]
102                l.next()
103                if l.token == '(':
104                    l.next()
105                    children = []
106                    parseUsingLexer(l, children)
107                    if l.token[6:16] == 'TAKEDOWN__':
108                        name2 = l.token[16:]
109                        l.next()
110                        if name == name2:
111                            tree.append(Bringup(name, children))
112                        else:
113                            print "ERROR: Expected __CUT_TAKEDOWN__%s, but found __CUT_TAKEDOWN__%s instead." % (name, name2)
114
115            elif (length > 14) and (l.token[6:13] == 'SETUP__'):
116                name = l.token[13:]
117                l.next()
118                if l.token == '(':
119                    l.next()
120                    children = []
121                    parseUsingLexer(l, children)
122                    if l.token[6:16] == 'TAKEDOWN__':
123                        name2 = l.token[16:]
124                        l.next()
125                        if name == name2:
126                            tree.append(Setup(name, children))
127                        else:
128                            print "ERROR: Expected __CUT_TAKEDOWN__%s, but found __CUT_TAKEDOWN__%s instead." % (name, name2)
129
130            elif (length > 17) and (l.token[6:16] == 'TAKEDOWN__'):
131                return
132
133            else:
134                l.next()
135
136
137def parse(filename, tree):
138    assert(common.typeOf(filename) == "str")
139    assert(common.typeOf(tree) == "list")
140
141    l = lexer.Lexer(open(filename, "r").read())
142    parseUsingLexer(l, tree)
143
144