From 5f018ba72a67016e1902039476a320d1fc155e17 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 31 Jan 2004 00:37:39 +0000 Subject: [PATCH] Next, begin to perform type inference. --- mad | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/mad b/mad index 03e1f07..84588da 100755 --- 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]) + ";" -- 2.43.0