Exemple #1
0
    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
Exemple #2
0
    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