示例#1
0
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)
示例#2
0
    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)