Esempio n. 1
0
    def __init__(self, tokenizer):
        """
        Creates a new compilation engine with the given tokenizer.
        """
        if not tokenizer or not tokenizer.filename:
            raise TypeError('Tokenizer not valid.')

        filename = re.sub('.jack$', '.vm', tokenizer.filename)

        self.tokenizer = tokenizer
        self.vm_writer = VMWriter(filename)
        self.symbol_table = SymbolTable(filename)
        self.classname = self.get_classname(filename)

        self.tokenizer.seperate_all()

        # Different keywords and operators partition to digest
        # the structure of program.
        self.class_var_dec = ['static', 'field']
        self.subroutines = ['constructor', 'function', 'method']
        self.statements = ['let', 'do', 'if', 'while', 'return']
        self.ops = ['+', '-', '*', '/', '&', '|', '<', '>', '=']
        self.unary_ops = ['~', '-']

        # Determines the current subroutine in use.
        self.current_fn_type = None
        self.current_fn_name = None

        self.if_idx = 0
        self.while_idx = 0

        self.verbal_arithemtic = {
            '>': 'GT',
            '<': 'LT',
            '=': 'EQ',
            '|': 'OR',
            '-': 'SUB',
            '+': 'ADD',
            '&': 'AND'
        }

        self.verbal_unary = {'~': 'NOT', '-': 'NEG'}