else:
return('// ' + `statement`)
-if __name__ == '__main__':
- source = sys.stdin.read()
- # Grotty hack to add end-of-statement delimiters
- source = re.sub('\n([A-Z]|\t)', ' ;\n\\1', source).rstrip() + ' ;\n'
- yacc.parse(source)
-
- analyze(deck)
-
- print '#include <math.h>'
- print 'main(int argc, char *argv[])'
- print '{'
+def generate(out):
+ out.write('#include <math.h>\n')
+ out.write('main(int argc, char *argv[])\n')
+ out.write('{\n')
if integers:
- print '\tint ' + ', '.join(integers) + ';\t/* INTEGER */'
+ out.write('\tint ' + ', '.join(integers) + ';\t/* INTEGER */\n')
if bools:
- print '\tint ' + ', '.join(bools) + ';\t/* boolean */'
+ out.write('\tint ' + ', '.join(bools) + ';\t/* boolean */\n')
if untyped:
- print '\tfloat ' + ', '.join(untyped) + ';\t/* untyped */'
+ out.write('\tfloat ' + ', '.join(untyped) + ';\t/* untyped */\n')
if floats:
- print '\tfloat ' + ', '.join(floats) + ';'
+ out.write('\tfloat ' + ', '.join(floats) + ';\n')
for (id, value) in static.items():
- print '\tstatic const char *%s\t= "%s";' % (id, fmt_convert(value))
+ out.write('\tstatic const char *%s\t= "%s";\n' % (id, fmt_convert(value)))
indent = 0
for (label, statement) in deck:
if label in targets:
sys.stdout.write(label+':')
rep = print_statement(statement)
if rep:
- sys.stdout.write('\t' + ' '*indent + rep + '\n')
+ out.write('\t' + ' '*indent + rep + '\n')
if rep[-1] == '{':
indent += 1
if label in scopes:
indent -= 1
- print ('\t' + ' '*indent) + '}'
- print '}'
+ out.write(('\t' + ' '*indent) + '}\n')
+ out.write('}\n')
+
+if __name__ == '__main__':
+ source = sys.stdin.read()
+ # Grotty hack to add end-of-statement delimiters
+ source = re.sub('\n([A-Z]|\t)', ' ;\n\\1', source).rstrip() + ' ;\n'
+ # Parse
+ yacc.parse(source)
+ # Perform global analysis
+ analyze(deck)
+ # Generate code
+ generate(sys. stdout)
+