From cd3563f4d2e434a9af3c52b6871f4fcef085d600 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 10 Feb 2004 16:49:15 +0000 Subject: [PATCH] LIST statements are imoplemented. --- mad | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/mad b/mad index 39a891d..a006761 100755 --- a/mad +++ b/mad @@ -126,8 +126,6 @@ def initfunc(f): global currentfunc currentfunc = f typedict[currentfunc] = {} - arraydepths[currentfunc] = {} - dimensions[currentfunc] = {} funcnames.append(currentfunc) initfunc("main.") @@ -419,7 +417,7 @@ def p_expression_subscript(t): t[0] = ('variable', t[1], tuple(t[2])) var = t[1] refcount[var] = refcount.get(var, 0) + 1 - arraydepths[currentfunc][var] = len(t[2]) + arraydepths[var] = len(t[2]) def p_function_application(t): 'expression : FUNCALL application' @@ -486,10 +484,9 @@ def analyze(): typedict[currentfunc][var] = 'bool' elif statement[0] == 'dimension': for (var, dimlist) in statement[1]: - dimensions[currentfunc][var] = dimlist + dimensions[var] = dimlist elif statement == 'entry': currentfunc = statement[1] - dimensions[currentfunc] = {} funcline = line elif statement[0] == 'integer': for var in statement[1:]: @@ -516,6 +513,14 @@ def analyze(): elif statement[0] == 'internal': deck.insert(lastentry + internalcount, deck.pop(i)) internalcount += 1 + # Reorder code tuples so SET LIST arrays are global. + firstentry = -1 + for i in range(len(deck)): + (file, line, label, statement) = deck[i] + if statement[0] == 'entry' and firstentry == -1: + firstentry = i + elif statement[0] == 'set_list_to': + deck.insert(firstentry, deck.pop(i)) # Do type deductions from format fields for card in deck: (file, line, label, statement) = card @@ -768,12 +773,11 @@ def print_statement(statement): elif statement[0] == 'entry': func = statement[1] types = typedict[func] - depths = arraydepths[currentfunc] rep = "\n" + returntypes.get(func, normalmode) + " " + func[:-1] + "(" defaulted = [] if statement[2]: for (dummy, var) in statement[2]: - declarator = ("*" * depths.get(var, 0)) + var + declarator = ("*" * arraydepths.get(var, 0)) + var if var in types: rep += types[var] + " " + declarator + ", " del types[var] @@ -816,6 +820,8 @@ def print_statement(statement): rep='for (int %s = 0; %s < %d; %s++) {%s = '%(dummy, dummy, count, dummy, statement[2]) rep += "((%s [%d]){%s})[%s];" % (statement[3][0][0][:-3], count, ", ".join(map(lambda x: `x[1]`, statement[3])), dummy) return rep + elif statement[0] == 'or': + return 'else if (' + print_expr(statement[2]) + ') {' elif statement[0] == 'otherwise': return 'else {' elif statement[0] == 'pause': @@ -834,15 +840,24 @@ def print_statement(statement): return "\n" else: return "/* %s */" % statement[1].strip() + elif statement[0] == 'restore': + rep = "" + for var in statement[1]: + rep += "%s = (%s)(*--recursor); " % (var, typedict[currentfunc][var]) + return rep; elif statement[0] == 'return': if len(statement) == 1: return "return;" else: return "return %s;" % print_expr(statement[1]) - elif statement[0] == 'or': - return 'else if (' + print_expr(statement[2]) + ') {' + elif statement[0] == 'save': + rep = '' + for expr in statement[1]: + rep += '*recursor++ = (double)(%s); ' % print_expr(expr) + return rep elif statement[0] == 'set_list_to': - return normalmode + " *recursor = " + statement[1] + ";" + var = statement[1] + return normalmode + " " + prin1(('variable', var, dimensions[var])) + ", *recursor = " + var + ";" elif statement[0] == 'substitution': return statement[1] + ' = ' + print_expr(statement[2]) + ';' elif statement[0] == 'whenever': -- 2.43.0