def compile_parse_tree(self, filename: str, parse_tree) -> Code: """ Takes a filename and a parse_tree and returns a BytecodeAssembler Code object :param filename: filename of file to compile :param parse_tree: parse_tree to compile :rtype: Code """ filename = os.path.abspath(filename) line_no = -1 code = Code() code.set_lineno(line_no) code = self.bootstrap_obj(code) line_no += 1 code.co_filename = filename line_no, code = self.compile_parse_tree_internal( codeobject=code, parse_tree=parse_tree, line_no=line_no, filename=filename ) code.return_(None) return code
def compile_single(self, codeobject: Code, filename: str, element: Node, line_no: int, result_required: bool, scope: list) -> tuple: """ compiles a single Node """ codeobject.set_lineno(element.content[0].line_no) if isinstance(element.content[0], (IDNode, SymbolNode)): if element.content[0].content == 'defun': # wahey! creating a function! line_no, codeobject = self.compile_function( codeobject, filename, element, line_no ) elif element.content[0].content == 'lambda': raise Exception((element, element.content)) elif element.content[0].content in ('let', 'defparameter', 'defvar'): # inline variable assignments line_no, codeobject = self.handle_variable_assignment( codeobject, filename, element, line_no, scope ) else: # whahey! calling a function! line_no, codeobject = self.call_function( codeobject, filename, element, line_no, scope ) if not result_required: # if the result aint required, clean up the stack codeobject.POP_TOP() else: raise Exception('{} -> {}'.format(element, element.content)) return line_no, codeobject