#!/usr/bin/env python """Usage: sixtypical [OPTIONS] FILES Analyzes and/or executes and/or compiles a Sixtypical program. """ from os.path import realpath, dirname, join import sys sys.path.insert(0, join(dirname(realpath(sys.argv[0])), '..', 'src')) # ----------------------------------------------------------------- # import codecs from optparse import OptionParser import sys import traceback from sixtypical.parser import Parser from sixtypical.evaluator import eval_program from sixtypical.analyzer import analyze_program from sixtypical.emitter import Emitter, Byte, Word from sixtypical.compiler import Compiler if __name__ == '__main__': optparser = OptionParser(__doc__.strip()) optparser.add_option("--analyze", action="store_true", help="") optparser.add_option("--basic-prelude", action="store_true", help="") optparser.add_option("--compile", action="store_true", help="") optparser.add_option("--debug", action="store_true", help="") optparser.add_option("--traceback", action="store_true", help="") optparser.add_option("--execute", action="store_true", help="") (options, args) = optparser.parse_args(sys.argv[1:]) for filename in args: text = open(filename).read() p = Parser(text) program = p.program() if options.analyze: try: analyze_program(program) except Exception as e: if options.traceback: raise else: traceback.print_exception(e.__class__, e, None) sys.exit(1) if options.compile: fh = sys.stdout start_addr = 0xc000 prelude = [] if options.basic_prelude: start_addr = 0x0801 prelude = [0x10, 0x08, 0xc9, 0x07, 0x9e, 0x32, 0x30, 0x36, 0x31, 0x00, 0x00, 0x00] # we are outputting a .PRG, so we output the load address first # we don't use the Emitter for this b/c not part of addr space fh.write(Word(start_addr).serialize(0)) emitter = Emitter(start_addr) for byte in prelude: emitter.emit(Byte(byte)) compiler = Compiler(emitter) compiler.compile_program(program) if options.debug: print repr(emitter.accum) else: emitter.serialize(fh) if options.execute: context = eval_program(program) print str(context)