]> thyrsus.com Git - mad.git/commitdiff
Next, begin to perform type inference.
authorEric S. Raymond <esr@thyrsus,com>
Sat, 31 Jan 2004 00:37:39 +0000 (00:37 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Sat, 31 Jan 2004 00:37:39 +0000 (00:37 +0000)
mad

diff --git a/mad b/mad
index 03e1f073c45b84c6128216453039d7bea6d99eca..84588da380fc521e61da6f43a39a0a8d8f3fb8b0 100755 (executable)
--- a/mad
+++ b/mad
@@ -400,22 +400,22 @@ def analyze():
         if deck[i][3][0] != 'remark':
             break
     if deck[i][3][0] != 'external_function':
-        deck.insert(i, (deck[i][0], i, None, ('entry', ('apply', 'main.',()))))
+        deck.insert(i, (deck[i][0], i, None, ('entry', 'main.',())))
     else:
         for i in range(len(deck)):
             (file, line, label, statement) = deck[i]
             if statement[0] == 'end_function' and i < len(deck)-1 and deck[i+1][2][0] != 'extern':
-                deck.insert(i, (file, line, None, ('entry', ('apply', 'main.', ()))))
+                deck.insert(i, (file, line, None, ('entry', 'main.', ())))
     # Mine the code for compile-time directives
     for (file, line, label, statement) in deck:
         if statement[0] == 'dimension':
             for (var, dimlist) in statement[1]:
                 dimensions[var] = dimlist
         elif statement == 'entry':
-            currentfunc = statement[1][0]
+            currentfunc = statement[1]
         elif statement[0] == 'integer':
             for var in statement[1:]:
-                typedict[currentfunc][var] = 'integer'
+                typedict[currentfunc][var] = 'int'
         elif statement[0] == 'substitution':
             typedict[currentfunc][statement[1]] = 'double'
         elif statement[0] in ('read', 'print'):
@@ -430,19 +430,17 @@ def analyze():
     # Now associate entry point names with function definitions:
     for i in range(len(deck)):
         (file, line, label, statement) = deck[i]
-        if statement[0] == 'entry' and type(statement[1]) == type(""):
+        if statement[0] == 'entry' and len(statement) == 2:
             name = statement[1]
             for j in range(i):
                 prev = deck[i-j-1][3]
                 if prev[0] == 'external_function':
-                    deck[i] = (file, line, label, ('entry',
-                                                   ('apply', name, prev[1])))
+                    deck[i] = (file, line, label, ('entry', name, prev[1]))
                     break
                 elif prev[0] == 'entry':
                     croak(prev, "multiple ENTRY points are not supported")
             else:
                 croak(deck[i], 'no EXTERNAL declaration matches this ENTRY')
-                
 
 def prin1(t):
     if t[0] == 'variable':
@@ -574,13 +572,25 @@ def print_statement(statement):
     elif statement[0] in ('end_program', 'end_function', 'end_conditional'):
         return "}"
     elif statement[0] == 'entry':
-        rep = "\n" + print_expr(statement[1]) + " {"
-        funcname = statement[1][1]
-        localvars = typedict[funcname].keys()
-       for type in ('double', 'integer'):
-            vars = filter(lambda x: typedict[funcname][x] == type, localvars)
+        func = statement[1]
+        types = typedict[func]
+        rep = "\n" + func[:-1] + "("
+        if statement[2]:
+            for (dummy, var) in statement[2]:
+                if var in types:
+                    rep += types[var] + " " + var + ", "
+                    del types[var]
+                else:
+                    rep += "UNTYPED " + var + ", "
+            rep = rep[:-2]
+        rep  = rep + ") {"
+        declarations = ""
+       for type in ('double', 'int'):
+            vars = filter(lambda x: types[x] == type, types.keys())
             if vars: 
-                rep += "\n    " + type + " " + ", ".join(vars) + ";"
+                declarations +=  type + " " + ", ".join(vars) + "; "
+        if declarations:
+            rep += "\n    " + declarations[:-1] + "\n"
         return rep
     elif statement[0] == 'execute':
         return print_expr(statement[1]) + ";"