本文整理汇总了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)
#.........这里部分代码省略.........