]> thyrsus.com Git - mad.git/commitdiff
LIST statements are imoplemented.
authorEric S. Raymond <esr@thyrsus,com>
Tue, 10 Feb 2004 16:49:15 +0000 (16:49 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Tue, 10 Feb 2004 16:49:15 +0000 (16:49 +0000)
mad

diff --git a/mad b/mad
index 39a891d769b0ddd3e2e0de3a6f24b7fd99b54549..a006761e042632f6564afed2602dede240c54420 100755 (executable)
--- 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':