class Compiler: """This class encapsulates all the compiling process.""" def __init__(self): self.setUpLogging() self.debug = False self.input = sys.stdin #We use 'buffer' to get a stream of bytes, not str, because we want to #encode it using utf-8 (just for safety). self.output = sys.stdout.buffer #Create all the data structures needed. self.defCats = {} self.defAttrs = {} self.defVars = {} self.defLists = {} #Initialize all the compiler's components. self.callStack = CallStack() self.symbolTable = SymbolTable() self.codeGenerator = AssemblyCodeGenerator() #here we set the code generator to use self.eventHandler = EventHandler(self) self.parser = ExpatParser(self) def setUpLogging(self): """Set at least an error through stderr logger""" self.formatString = '%(levelname)s: %(filename)s[%(lineno)d]:\t%(message)s' self.logger = logging.getLogger('compiler') errorHandler = logging.StreamHandler(sys.stderr) errorHandler.setFormatter(logging.Formatter(self.formatString)) errorHandler.setLevel(logging.ERROR) self.logger.addHandler(errorHandler) def setDebug(self, fileName): """Set the debug capabilities using the file passed.""" self.debug = True self.codeGenerator.debug = True self.logger.setLevel(logging.DEBUG) debugHandler = logging.FileHandler(filename=fileName, mode='w', encoding='utf-8') debugHandler.setFormatter(logging.Formatter(self.formatString)) debugHandler.setLevel(logging.DEBUG) self.logger.addHandler(debugHandler) def compile(self): try: self.parser.parse(self.input.read()) self.output.write(self.codeGenerator.getWritableCode()) self.logger.debug(str(self.symbolTable)) except (CompilerError, Exception) as e: if self.debug: self.logger.exception(e) else: self.logger.error(e) exit(1)
def __init__(self): self.setUpLogging() self.debug = False self.input = sys.stdin #We use 'buffer' to get a stream of bytes, not str, because we want to #encode it using utf-8 (just for safety). self.output = sys.stdout.buffer #Create all the data structures needed. self.defCats = {} self.defAttrs = {} self.defVars = {} self.defLists = {} #Initialize all the compiler's components. self.callStack = CallStack() self.symbolTable = SymbolTable() self.codeGenerator = AssemblyCodeGenerator() #here we set the code generator to use self.eventHandler = EventHandler(self) self.parser = ExpatParser(self)