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'}