From e392bc8d8f21d517de5828a12b9599187d42ea31 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 20 Jan 2004 12:23:18 +0000 Subject: [PATCH] This version compiles newton1.mad. --- mad | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/mad b/mad index bbf1464..fe0669a 100755 --- 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 ' - print 'main(int argc, char *argv[])' - print '{' +def generate(out): + out.write('#include \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) + -- 2.43.0