jtlcpy/jtlc
2011-08-30 16:10:13 -04:00

74 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python
import os
import sys
import argparse
import tempfile
from subprocess import *
import re
import parser
from Compiler import Compiler
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
success = True
ofiles = []
for s in args.sources:
tf = tempfile.NamedTemporaryFile(suffix = '.c', delete = False)
tfname = tf.name
success = build(args, s, tf)
tf.close()
if success:
m = re.match('(.*)\.jtl', s)
if m is not None:
ofname = m.group(1) + '.o'
else:
ofname = s + '.o'
do_compile(args, tfname, ofname)
ofiles.append(ofname)
os.unlink(tfname)
if success and not args.c:
do_link(args, ofiles)
return 0
def build(args, source, dest):
f = open(source, 'r')
contents = f.read()
f.close()
result = parser.parse(contents)
if result is None:
return False
return Compiler().compile(result, dest)
def do_compile(args, source_fname, ofname):
Popen(['grep', '-n', '.', source_fname]).wait()
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))