]> thyrsus.com Git - mad.git/commitdiff
This version compiles newton1.mad.
authorEric S. Raymond <esr@thyrsus,com>
Tue, 20 Jan 2004 12:23:18 +0000 (12:23 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Tue, 20 Jan 2004 12:23:18 +0000 (12:23 +0000)
mad

diff --git a/mad b/mad
index bbf146412d9f706d087275d899e9df2e81065d5a..fe0669aebb12b98d74a9a9bb3c79b1612739f5e9 100755 (executable)
--- a/mad
+++ b/mad
@@ -437,37 +437,42 @@ def print_statement(statement):
     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)
+