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'):
# 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':
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]) + ";"