global currentfunc
currentfunc = f
typedict[currentfunc] = {}
- arraydepths[currentfunc] = {}
- dimensions[currentfunc] = {}
funcnames.append(currentfunc)
initfunc("main.")
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'
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:]:
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
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]
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':
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':