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