t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'
-t_FLOATNUM= r'\d+\.\d*'
-t_INTNUM = r'\d+'
+#t_INTNUM = r'\d+'
t_STRING = r'\$[^$]*\$'
reserved_map = { }
t.value = t.value.lower()
return t
+def t_FLOATNUM(t):
+ r'\d+\.\d*'
+ if t.value[-1] == '.':
+ t.value += "0"
+ return t
+
+def t_INTNUM(t):
+ r'\d+'
+ # Leading zeros flip us into ocal in C, therefore strip them.
+ while len(t.value) > 1 and t.value[0] == '0':
+ t.value = t.value[1:]
+ return t
+
t_ignore = ' \n'
def t_error(t):
sourceline = 0
deck = []
scopes = []
-targets = []
+targets = {}
untyped = []
# Program level
def p_transfer(t):
'statement : TRANSFER TO NAME'
t[0] = ('goto', t[3])
- targets.append(t[3])
+ targets[t[3]] = targets.get(t[3], 0) + 1
## WHENEVER
def p_whenever_simple(t):
return res
def print_statement(statement):
- if statement[0] in ('dimension', 'end_program', 'integer', 'values'):
+ if statement[0] in ('dimension',
+ 'end_program',
+ 'function',
+ 'integer',
+ 'values'):
pass
elif statement[0] == 'for':
(keyword, label, dummy, start, increment, predicate) = statement
elif statement[0] == 'read':
return 'scanf("' + fmt_convert(format[statement[1]], write=False) + '", ' + ', '.join(map(lambda x: '&'+x, statement[2:])) + ');'
elif statement[0] == 'print':
- return 'printf("' + fmt_convert(format[statement[1]]) + '", ' + ', '.join(statement[2:]) + ');'
+ fmt = fmt_convert(format[statement[1]])
+ if len(statement) < 3:
+ return 'printf("' + fmt + '");'
+ else:
+ return 'printf("' + fmt + '", ' + ', '.join(statement[2:]) + ');'
elif statement[0] == 'substitution':
return statement[1] + ' = ' + print_expr(statement[2]) + ';'
else:
out.write('#include <math.h>\n\n')
for (line, label, statement) in deck:
- if statement == 'function':
+ if statement[0] == 'function':
# FIXME: someday, deduce when return is of integral type
- out.write('float %s {return %s;}' \
- (t[1], print_expr(('apply', t[2], t[3])),t[4]))
+ out.write('float %s {return %s;}\n' % \
+ (print_expr(('apply', statement[1], statement[2])), print_expr(statement[3])))
out.write('\nmain(int argc, char *argv[])\n')
out.write('{\n')
global sourceline
for (sourceline, label, statement) in deck:
if label in targets:
- sys.stdout.write(label+':')
+ out.write(label+':')
rep = print_statement(statement)
if rep:
out.write('\t' + ' '*indent + rep + '\n')
yacc.parse(source, debug=mad_debug)
# Perform global analysis
- analyze(deck)
+ analyze(deck)
# Generate code
if arguments == ('-',):
generate(sys.stdout)