当前位置: 首页>>代码示例>>Python>>正文


Python Writer.append方法代码示例

本文整理汇总了Python中writer.Writer.append方法的典型用法代码示例。如果您正苦于以下问题:Python Writer.append方法的具体用法?Python Writer.append怎么用?Python Writer.append使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在writer.Writer的用法示例。


在下文中一共展示了Writer.append方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: Compiler

# 需要导入模块: from writer import Writer [as 别名]
# 或者: from writer.Writer import append [as 别名]
class Compiler(Visitor):

    """
    Die Hauptklasse zur Übersetzung.
    """
    def __init__(self, module):
        self.module = module
        self.buf = Writer() # modul-ebene

        self.function_buf = Writer() # funktionen kommen seperat
        self.label_count = 0

        self.jump_table = {} # offsets der funktionen

    def _gen_label(self):
        """
        Erstellt ein einzigartiges Lebel nach dem Muster "Lx", wobei "x"
        eine beliebige Integerzahl ist.
        """
        self.label_count += 1
        return "".join(("L", str(self.label_count)))

    def compile(self):
        """
        Diese Funktion ist die einzige, die direkt von außerhalb aufgerufen wird.
        Sie steuert den Prozess der Übersetzung.
        """
        for node in self.module.ast:
            node.resolve(self.module)
            self.visit(node)
        self.buf.append("EOF") # ende des globalen scopes
        self.buf.append(self.function_buf) # func-decls kommen ans ende des moduls 
        self.buf.write(FILENAME) # Just for fun file writing
        return str(self.buf)
    
    def visit_FunctionDecl(self, node):
        """
        Während der Übersetzung der Funktion wird ein temporäres Writer-Objekt
        zum neuen Buffer, in den der Bytecode geschrieben wird. Dadurch 
        werden unnötige Sprünge vermieden.
        """
        backup = self.buf
        self.buf = self.function_buf
        func_label = self._gen_label()
        self.buf.append(Label(func_label))
        self.jump_table[str(node.ident)] = func_label 
        for arg in node.args:
            self.buf.append("STORE")
            self.buf.append(str(arg))
        for subnode in node.body:
            self.visit(subnode)

        self.buf = backup

    def visit_FunctionCall(self, node):
        """
        Übersetzt einen Funktionsaufruf.
        """
        for arg in reversed(node.args):
            self.visit(arg) 
        self.buf.append("PUSH_SCOPE") # Scope der Funktion

        jump_back_label = self._gen_label()

        self.buf.append("PUSH_ADDRESS") # Ruecksprung
        self.buf.append(Marker(jump_back_label))


        self.buf.append("JUMP") # Aufruf, func-offset
        self.buf.append(Label(jump_back_label)) # ruecksprung-label
        self.buf.append(Marker(self.jump_table[str(node.ident)]))


    def visit_ReturnStatement(self, node):
        """
        Übersetzt eine Return-Anweisung.
        """
        self.visit(node.expr)
        self.buf.append("POP_SCOPE")
        self.buf.append("RET")
        
    def visit_BinaryOp(self, node):
        """
        Übersetzt einen binären Ausdruck, wie beispielsweise "2 + 2".
        """
        self.visit(node.right)
        self.visit(node.left)
        if node.op in math_symbols:
            operator = math_symbols[node.op]
        elif node.op in comparison_symbols:
            operator = comparison_symbols[node.op]
        self.buf.append(operator)

    def _load_const(self, node):
        self.buf.append("LOAD_CONST")
        self.buf.append(str(node.val))

    def visit_Integer(self, node):
        self._load_const(node)

#.........这里部分代码省略.........
开发者ID:showstopper,项目名称:payne,代码行数:103,代码来源:compiler.py


注:本文中的writer.Writer.append方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。