#!/usr/bin/env python import os import sys import argparse import tempfile from subprocess import * import re def main(argv): parser = argparse.ArgumentParser(prog = 'jtlc', description = "Josh's Toy Language Compiler") parser.add_argument('-E', action = 'store_true', help = 'Translate only; do not compile, assemble, or link') parser.add_argument('-c', action = 'store_true', help = 'Translate, compile, and assemble, but do not link') parser.add_argument('-o', metavar = 'file', dest = 'output_file', help = 'Output File') parser.add_argument('sources', metavar = 'source', nargs = '*', help = 'Input Source File') args = parser.parse_args(argv[1:]) if len(args.sources) < 1: sys.stderr.write(argv[0] + ': no input files\n') return 1 ofiles = [] for s in args.sources: tf = tempfile.NamedTemporaryFile(suffix = '.c', delete = False) tfname = tf.name build(args, s, tf) tf.close() m = re.match('(.*)\.jtl', s) if m is not None: ofname = m.group(1) + '.o' else: ofname = s + '.o' do_compile(args, tfname, ofname) os.unlink(tfname) ofiles.append(ofname) if not args.c: do_link(args, ofiles) return 0 def build(args, source, dest): dest.write('hi\n') def do_compile(args, source_fname, ofname): Popen(['gcc', '-o', ofname, '-c', source_fname]).wait() def do_link(args, ofiles): cmd = ['gcc'] if args.output_file is not None: cmd += ['-o', args.output_file] cmd += ofiles Popen(cmd).wait() if __name__ == '__main__': sys.exit(main(sys.argv))