123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- from generic_language_constructs import *
- class PythonWriter(GenericWriterBase):
- def __init__(self, outputter):
- self.out = outputter
- def writeComment(self, text):
- self.out.write("# " + text)
- def writeMultiLineComment(self, text):
- self.out.write("\"\"\"\n" + text + "\n\"\"\"")
- def visit_AndOperator(self, a):
- self.out.extendWrite(" and ")
- def visit_ArrayContains(self, a):
- array = a.getArrayExpression()
- el = a.getElementExpression()
- el.accept(self)
- self.out.extendWrite(" in ")
- array.accept(self)
- def visit_ArrayExpression(self, a):
- self.out.extendWrite("[")
- self.writeCommaSeparated(a.getElements())
- self.out.extendWrite("]")
- def visit_ArrayIndexOf(self, a):
- array = a.getArrayExpression()
- el = a.getElementExpression()
- array.accept(self)
- self.out.extendWrite(".index(")
- el.accept(self)
- self.out.extendWrite(")")
- def visit_ArrayLength(self, a):
- self.out.extendWrite("len(")
- a.getArrayExpression().accept(self)
- self.out.extendWrite(")")
- def visit_ArrayPushBack(self, a):
- array = a.getArrayExpression()
- el = a.getElementExpression()
- array.accept(self)
- self.out.extendWrite(".append(")
- el.accept(self)
- self.out.extendWrite(")")
- def visit_AST(self, ast):
- self.writeAll(ast.getEntries())
- def visit_Block(self, b):
- self.out.indent()
- self.writeAll(b.getEntries())
- if b.isEmpty():
- self.out.write("pass")
- self.out.dedent()
- def visit_BreakStatement(self, b):
- self.out.write("break")
- def visit_Class(self, c):
- class_name = c.getIdentifier()
- constructor = c.getConstructor()
- super_classes = c.getSuperClassIdentifierList()
- description = c.getDescription()
- self.out.write()
- if description:
- self.writeComment(description)
- self.out.write("class " + class_name)
- if super_classes:
- self.out.extendWrite("(" + ", ".join(super_classes) + ")")
- self.out.extendWrite(":")
- self.out.indent()
- constructor.accept(self)
- self.writeAll(c.getMembers())
- self.out.dedent()
- def visit_Constructor(self, constructor):
- #class_name = constructor.getClass().getIdentifier()
- parameters = constructor.getFormalParameters()
- body = constructor.getBody()
- self.out.write("def __init__")
- parameters.accept(self)
- self.out.extendWrite(":")
- body.accept(self)
- def visit_Destructor(self, destructor):
- #class_name = destructor.getClass().getIdentifier()
- parameters = destructor.getFormalParameters()
- body = destructor.getBody()
- self.out.write("def __del__")
- parameters.accept(self)
- self.out.extendWrite(":")
- body.accept(self)
- def visit_ElseStatement(self, else_stmt):
- self.out.write("else:")
- else_stmt.getBody().accept(self)
- def visit_ElseIfStatement(self, else_if):
- condition = else_if.getCondition()
- body = else_if.getBody()
- if else_if.isFirst():
- self.out.write("if ")
- else:
- self.out.write("elif ")
- condition.accept(self)
- self.out.extendWrite(":")
- body.accept(self)
- def visit_EqualsOperator(self, e):
- self.out.extendWrite(" == ")
- def visit_ExpressionStatement(self, stmt):
- self.out.write() # expressions don't begin with a newline
- stmt.expression.accept(self)
- def visit_FalseExpression(self, f):
- self.out.extendWrite("False")
- def visit_FormalParameter(self, parameter):
- self.out.extendWrite(parameter.getIdentifier())
- if parameter.getDefaultValue():
- self.out.extendWrite(" = None") # correct default value will be assigned in function body
- def visit_FormalParameters(self, p):
- params = [Literal("self")] + p.getParameterList()
- self.writeTuple(params)
- def visit_ForLoopCurrentElement(self, el):
- #collection = el.getCollectionExpression()
- iterator = el.getIteratorIdentifier()
- self.out.extendWrite(iterator)
- def visit_ForLoopIterateArray(self, loop):
- collection = loop.getCollectionExpression()
- iterator = loop.getIteratorIdentifier()
- body = loop.getBody()
- self.out.write("for " + iterator + " in ")
- collection.accept(self)
- self.out.extendWrite(":")
- body.accept(self)
- def visit_ForLoopIterateMapValues(self, loop):
- collection = loop.getCollectionExpression()
- iterator = loop.getIteratorIdentifier()
- body = loop.getBody()
- self.out.write("for " + iterator + " in ")
- collection.accept(self)
- self.out.extendWrite(".itervalues():")
- body.accept(self)
- def visit_IfStatement(self, if_stmt):
- condition = if_stmt.getCondition()
- body = if_stmt.getBody()
- self.out.write("if ")
- condition.accept(self)
- self.out.extendWrite(":")
- body.accept(self)
- def visit_IncludeStatement(self, i):
- module_path = i.getModulePath()
- imported_symbols = i.getImportedSymbols()
- self.out.write("from ")
- for j in range(len(module_path)):
- if j != 0:
- self.out.extendWrite(".")
- module_path[j].accept(self)
- self.out.extendWrite(" import ")
- if imported_symbols:
- self.writeCommaSeparated(imported_symbols)
- else:
- self.out.extendWrite("*")
- def visit_LocalVariableDeclaration(self, decl):
- identifier = decl.getIdentifier()
- init_value = decl.getInitValue()
- self.out.extendWrite(decl.getIdentifier())
- if init_value:
- self.out.extendWrite(" = ")
- init_value.accept(self)
- def visit_LogStatement(self, l):
- self.out.write("print \"" + l.getMessage() + "\"")
- def visit_MapExpression(self, m):
- elements = m.getElements()
- self.out.extendWrite("{")
- keys = elements.keys()
- for i in range(len(keys)):
- if i != 0:
- self.out.extendWrite(", ")
- self.out.extendWrite(keys[i] + " : ")
- self.out.extendWrite(" : ")
- elements[keys[i]].accept(self)
- self.out.extendWrite("}")
- def visit_MapIndexedExpression(self, i):
- m = i.getMapExpression()
- key = i.getKeyExpression()
- m.accept(self)
- self.out.extendWrite("[")
- key.accept(self)
- self.out.extendWrite("]")
- def visit_MapRemoveElement(self, stmt):
- map_expr = stmt.getMapExpression()
- key_expr = stmt.getKeyExpression()
- self.out.write() # this is a statement, not an expression
- map_expr.accept(self)
- self.out.extendWrite(".pop(")
- key_expr.accept(self)
- self.out.extendWrite(", None)")
- def visit_Method(self, method):
- class_name = method.getClass().getIdentifier()
- method_name = method.getIdentifier()
- description = method.getDescription()
- body = method.getBody()
- parameters = method.getFormalParameters()
- self.out.write()
- if description:
- self.writeComment(description)
- self.out.write("def " + method_name + "")
- parameters.accept(self)
- self.out.extendWrite(":")
- body.accept(self)
- def visit_MethodBody(self, body):
- method = body.getMethod()
- formal_parameters = method.getFormalParameters()
- formal_parameter_list = formal_parameters.getParameterList()
- self.out.indent()
- # check for undefined parameters and replace them with default values
- for p in formal_parameter_list:
- p_id = p.getIdentifier()
- p_default = p.getDefaultValue()
- if p_default:
- self.out.write("if " + p_id + " == None: " + p_id + " = ")
- p_default.accept(self)
- self.writeAll(body.getEntries())
- if body.isEmpty():
- self.out.write("pass")
- self.out.dedent()
- def visit_NewExpression(self, new):
- type_expr = new.getTypeExpression()
- params = new.getActualParameters()
- type_expr.accept(self)
- params.accept(self)
- def visit_NoneExpression(self, n):
- self.out.extendWrite("None")
- def visit_NotOperator(self, n):
- self.out.extendWrite("not ")
- def visit_OrOperator(self, o):
- self.out.extendWrite(" or ")
- def visit_Package(self, package):
- name = package.getIdentifier()
- description = package.getDescription()
- self.writeComment("package \"" + name + "\"")
- if description:
- self.writeComment(description)
- self.writeAll(package.getDeclarations())
- def visit_ReturnStatement(self, r):
- self.out.write("return ")
- r.getExpression().accept(self)
- def visit_RuntimeModuleIdentifier(self, r):
- self.out.extendWrite("python_runtime")
- def visit_SelfExpression(self, s):
- self.out.extendWrite("self")
- def visit_StaticAttribute(self, attr):
- name = attr.getIdentifier()
- init_value = attr.getInitValue()
- #class_name = attr.getClass().getIdentifier()
- if init_value:
- self.out.write(name + " = ")
- init_value.accept(self)
- else:
- self.out.write(name + " = None")
- def visit_SuperClassConstructorCall(self, call):
- super_class = call.getSuperClassIdentifier()
- params = call.getActualParameters()
- param_list = [Literal("self")] + params.getParameterList()
- params = ActualParameters(param_list)
- self.out.extendWrite(super_class)
- self.out.extendWrite(".__init__")
- params.accept(self)
- def visit_SuperClassDestructorCall(self, call):
- super_class = call.getSuperClassIdentifier()
- params = call.getActualParameters()
- param_list = [Literal("self")] + params.getParameterList()
- params = ActualParameters(param_list)
- self.out.extendWrite("if hasattr(")
- self.out.extendWrite(super_class)
- self.out.extendWrite(", \"__del__\"):")
- self.out.indent()
- self.out.write(super_class)
- self.out.extendWrite(".__del__")
- params.accept(self)
- self.out.dedent()
- def visit_SuperClassMethodCall(self, call):
- super_class = call.getSuperClassIdentifier()
- method_name = call.getMethodIdentifier()
- params = call.getActualParameters()
- param_list = [Literal("self")] + params.getParameterList()
- params = ActualParameters(param_list)
- self.out.extendWrite(super_class + "." + method_name)
- params.accept(self)
- def visit_ThrowExceptionStatement(self, stmt):
- self.out.write("raise Exception(")
- stmt.getExpression().accept(self)
- self.out.extendWrite(")")
- def visit_TrueExpression(self, t):
- self.out.extendWrite("True")
|