python_writer.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. from generic_language_constructs import *
  2. class PythonWriter(GenericWriterBase):
  3. def __init__(self, outputter):
  4. self.out = outputter
  5. def writeComment(self, text):
  6. self.out.write("# " + text)
  7. def writeMultiLineComment(self, text):
  8. self.out.write("\"\"\"\n" + text + "\n\"\"\"")
  9. def visit_AndOperator(self, a):
  10. self.out.extendWrite(" and ")
  11. def visit_ArrayContains(self, a):
  12. array = a.getArrayExpression()
  13. el = a.getElementExpression()
  14. el.accept(self)
  15. self.out.extendWrite(" in ")
  16. array.accept(self)
  17. def visit_ArrayExpression(self, a):
  18. self.out.extendWrite("[")
  19. self.writeCommaSeparated(a.getElements())
  20. self.out.extendWrite("]")
  21. def visit_ArrayIndexOf(self, a):
  22. array = a.getArrayExpression()
  23. el = a.getElementExpression()
  24. array.accept(self)
  25. self.out.extendWrite(".index(")
  26. el.accept(self)
  27. self.out.extendWrite(")")
  28. def visit_ArrayLength(self, a):
  29. self.out.extendWrite("len(")
  30. a.getArrayExpression().accept(self)
  31. self.out.extendWrite(")")
  32. def visit_ArrayPushBack(self, a):
  33. array = a.getArrayExpression()
  34. el = a.getElementExpression()
  35. array.accept(self)
  36. self.out.extendWrite(".append(")
  37. el.accept(self)
  38. self.out.extendWrite(")")
  39. def visit_AST(self, ast):
  40. self.writeAll(ast.getEntries())
  41. def visit_Block(self, b):
  42. self.out.indent()
  43. self.writeAll(b.getEntries())
  44. if b.isEmpty():
  45. self.out.write("pass")
  46. self.out.dedent()
  47. def visit_BreakStatement(self, b):
  48. self.out.write("break")
  49. def visit_Class(self, c):
  50. class_name = c.getIdentifier()
  51. constructor = c.getConstructor()
  52. super_classes = c.getSuperClassIdentifierList()
  53. description = c.getDescription()
  54. self.out.write()
  55. if description:
  56. self.writeComment(description)
  57. self.out.write("class " + class_name)
  58. if super_classes:
  59. self.out.extendWrite("(" + ", ".join(super_classes) + ")")
  60. self.out.extendWrite(":")
  61. self.out.indent()
  62. constructor.accept(self)
  63. self.writeAll(c.getMembers())
  64. self.out.dedent()
  65. def visit_Constructor(self, constructor):
  66. #class_name = constructor.getClass().getIdentifier()
  67. parameters = constructor.getFormalParameters()
  68. body = constructor.getBody()
  69. self.out.write("def __init__")
  70. parameters.accept(self)
  71. self.out.extendWrite(":")
  72. body.accept(self)
  73. def visit_Destructor(self, destructor):
  74. #class_name = destructor.getClass().getIdentifier()
  75. parameters = destructor.getFormalParameters()
  76. body = destructor.getBody()
  77. self.out.write("def __del__")
  78. parameters.accept(self)
  79. self.out.extendWrite(":")
  80. body.accept(self)
  81. def visit_ElseStatement(self, else_stmt):
  82. self.out.write("else:")
  83. else_stmt.getBody().accept(self)
  84. def visit_ElseIfStatement(self, else_if):
  85. condition = else_if.getCondition()
  86. body = else_if.getBody()
  87. if else_if.isFirst():
  88. self.out.write("if ")
  89. else:
  90. self.out.write("elif ")
  91. condition.accept(self)
  92. self.out.extendWrite(":")
  93. body.accept(self)
  94. def visit_EqualsOperator(self, e):
  95. self.out.extendWrite(" == ")
  96. def visit_ExpressionStatement(self, stmt):
  97. self.out.write() # expressions don't begin with a newline
  98. stmt.expression.accept(self)
  99. def visit_FalseExpression(self, f):
  100. self.out.extendWrite("False")
  101. def visit_FormalParameter(self, parameter):
  102. self.out.extendWrite(parameter.getIdentifier())
  103. if parameter.getDefaultValue():
  104. self.out.extendWrite(" = None") # correct default value will be assigned in function body
  105. def visit_FormalParameters(self, p):
  106. params = [Literal("self")] + p.getParameterList()
  107. self.writeTuple(params)
  108. def visit_ForLoopCurrentElement(self, el):
  109. #collection = el.getCollectionExpression()
  110. iterator = el.getIteratorIdentifier()
  111. self.out.extendWrite(iterator)
  112. def visit_ForLoopIterateArray(self, loop):
  113. collection = loop.getCollectionExpression()
  114. iterator = loop.getIteratorIdentifier()
  115. body = loop.getBody()
  116. self.out.write("for " + iterator + " in ")
  117. collection.accept(self)
  118. self.out.extendWrite(":")
  119. body.accept(self)
  120. def visit_ForLoopIterateMapValues(self, loop):
  121. collection = loop.getCollectionExpression()
  122. iterator = loop.getIteratorIdentifier()
  123. body = loop.getBody()
  124. self.out.write("for " + iterator + " in ")
  125. collection.accept(self)
  126. self.out.extendWrite(".itervalues():")
  127. body.accept(self)
  128. def visit_IfStatement(self, if_stmt):
  129. condition = if_stmt.getCondition()
  130. body = if_stmt.getBody()
  131. self.out.write("if ")
  132. condition.accept(self)
  133. self.out.extendWrite(":")
  134. body.accept(self)
  135. def visit_IncludeStatement(self, i):
  136. module_path = i.getModulePath()
  137. imported_symbols = i.getImportedSymbols()
  138. self.out.write("from ")
  139. for j in range(len(module_path)):
  140. if j != 0:
  141. self.out.extendWrite(".")
  142. module_path[j].accept(self)
  143. self.out.extendWrite(" import ")
  144. if imported_symbols:
  145. self.writeCommaSeparated(imported_symbols)
  146. else:
  147. self.out.extendWrite("*")
  148. def visit_LocalVariableDeclaration(self, decl):
  149. identifier = decl.getIdentifier()
  150. init_value = decl.getInitValue()
  151. self.out.extendWrite(decl.getIdentifier())
  152. if init_value:
  153. self.out.extendWrite(" = ")
  154. init_value.accept(self)
  155. def visit_LogStatement(self, l):
  156. self.out.write("print \"" + l.getMessage() + "\"")
  157. def visit_MapExpression(self, m):
  158. elements = m.getElements()
  159. self.out.extendWrite("{")
  160. keys = elements.keys()
  161. for i in range(len(keys)):
  162. if i != 0:
  163. self.out.extendWrite(", ")
  164. self.out.extendWrite(keys[i] + " : ")
  165. self.out.extendWrite(" : ")
  166. elements[keys[i]].accept(self)
  167. self.out.extendWrite("}")
  168. def visit_MapIndexedExpression(self, i):
  169. m = i.getMapExpression()
  170. key = i.getKeyExpression()
  171. m.accept(self)
  172. self.out.extendWrite("[")
  173. key.accept(self)
  174. self.out.extendWrite("]")
  175. def visit_MapRemoveElement(self, stmt):
  176. map_expr = stmt.getMapExpression()
  177. key_expr = stmt.getKeyExpression()
  178. self.out.write() # this is a statement, not an expression
  179. map_expr.accept(self)
  180. self.out.extendWrite(".pop(")
  181. key_expr.accept(self)
  182. self.out.extendWrite(", None)")
  183. def visit_Method(self, method):
  184. class_name = method.getClass().getIdentifier()
  185. method_name = method.getIdentifier()
  186. description = method.getDescription()
  187. body = method.getBody()
  188. parameters = method.getFormalParameters()
  189. self.out.write()
  190. if description:
  191. self.writeComment(description)
  192. self.out.write("def " + method_name + "")
  193. parameters.accept(self)
  194. self.out.extendWrite(":")
  195. body.accept(self)
  196. def visit_MethodBody(self, body):
  197. method = body.getMethod()
  198. formal_parameters = method.getFormalParameters()
  199. formal_parameter_list = formal_parameters.getParameterList()
  200. self.out.indent()
  201. # check for undefined parameters and replace them with default values
  202. for p in formal_parameter_list:
  203. p_id = p.getIdentifier()
  204. p_default = p.getDefaultValue()
  205. if p_default:
  206. self.out.write("if " + p_id + " == None: " + p_id + " = ")
  207. p_default.accept(self)
  208. self.writeAll(body.getEntries())
  209. if body.isEmpty():
  210. self.out.write("pass")
  211. self.out.dedent()
  212. def visit_NewExpression(self, new):
  213. type_expr = new.getTypeExpression()
  214. params = new.getActualParameters()
  215. type_expr.accept(self)
  216. params.accept(self)
  217. def visit_NoneExpression(self, n):
  218. self.out.extendWrite("None")
  219. def visit_NotOperator(self, n):
  220. self.out.extendWrite("not ")
  221. def visit_OrOperator(self, o):
  222. self.out.extendWrite(" or ")
  223. def visit_Package(self, package):
  224. name = package.getIdentifier()
  225. description = package.getDescription()
  226. self.writeComment("package \"" + name + "\"")
  227. if description:
  228. self.writeComment(description)
  229. self.writeAll(package.getDeclarations())
  230. def visit_ReturnStatement(self, r):
  231. self.out.write("return ")
  232. r.getExpression().accept(self)
  233. def visit_RuntimeModuleIdentifier(self, r):
  234. self.out.extendWrite("python_runtime")
  235. def visit_SelfExpression(self, s):
  236. self.out.extendWrite("self")
  237. def visit_StaticAttribute(self, attr):
  238. name = attr.getIdentifier()
  239. init_value = attr.getInitValue()
  240. #class_name = attr.getClass().getIdentifier()
  241. if init_value:
  242. self.out.write(name + " = ")
  243. init_value.accept(self)
  244. else:
  245. self.out.write(name + " = None")
  246. def visit_SuperClassConstructorCall(self, call):
  247. super_class = call.getSuperClassIdentifier()
  248. params = call.getActualParameters()
  249. param_list = [Literal("self")] + params.getParameterList()
  250. params = ActualParameters(param_list)
  251. self.out.extendWrite(super_class)
  252. self.out.extendWrite(".__init__")
  253. params.accept(self)
  254. def visit_SuperClassDestructorCall(self, call):
  255. super_class = call.getSuperClassIdentifier()
  256. params = call.getActualParameters()
  257. param_list = [Literal("self")] + params.getParameterList()
  258. params = ActualParameters(param_list)
  259. self.out.extendWrite("if hasattr(")
  260. self.out.extendWrite(super_class)
  261. self.out.extendWrite(", \"__del__\"):")
  262. self.out.indent()
  263. self.out.write(super_class)
  264. self.out.extendWrite(".__del__")
  265. params.accept(self)
  266. self.out.dedent()
  267. def visit_SuperClassMethodCall(self, call):
  268. super_class = call.getSuperClassIdentifier()
  269. method_name = call.getMethodIdentifier()
  270. params = call.getActualParameters()
  271. param_list = [Literal("self")] + params.getParameterList()
  272. params = ActualParameters(param_list)
  273. self.out.extendWrite(super_class + "." + method_name)
  274. params.accept(self)
  275. def visit_ThrowExceptionStatement(self, stmt):
  276. self.out.write("raise Exception(")
  277. stmt.getExpression().accept(self)
  278. self.out.extendWrite(")")
  279. def visit_TrueExpression(self, t):
  280. self.out.extendWrite("True")