stateful_writer.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. # Used by generic_generator to create an AST of generic language constructs
  2. # while visiting an AST of SCCD constructs
  3. from generic_language_constructs import *
  4. class ExpressionWrapper(SimpleExpression, AbstractList):
  5. def __init__(self, expr = None):
  6. self.expr = expr
  7. def add(self, expr):
  8. if self.expr:
  9. raise Exception("Expression can only be set once.")
  10. self.expr = expr
  11. def get(self):
  12. return self.expr
  13. class StatefulWriter:
  14. def __init__(self):
  15. self.ast = AST()
  16. self.last = None
  17. self.stack = [self.ast]
  18. def get(self):
  19. return self.stack[-1]
  20. def startRecordingExpression(self):
  21. self.stack.append(ExpressionWrapper())
  22. def stopRecordingExpression(self):
  23. self.last = self.stack.pop()
  24. if not isinstance(self.last, ExpressionWrapper):
  25. raise Exception("Assymetry detected.")
  26. return self.last.get()
  27. def add(self, block_entry):
  28. self.get().add(block_entry)
  29. #### SHORTHANDS ####
  30. def addActualParameter(self, expr):
  31. self.get().getActualParameters().add(expr)
  32. def addAssignment(self, lhs, rhs):
  33. self.add(AssignmentExpression(lhs, rhs))
  34. def addInclude(self, module_path, symbols = None):
  35. self.add(IncludeStatement(module_path, symbols))
  36. def addComment(self, comment):
  37. self.add(SingleLineComment(comment))
  38. def addFormalParameter(self, parameter, default_value = None):
  39. self.get().getFormalParameters().add(FormalParameter(parameter, default_value))
  40. def addMultiLineComment(self, comment):
  41. self.add(MultiLineComment(comment))
  42. def addRawCode(self, raw):
  43. self.add(RawCode(raw))
  44. def addStaticAttribute(self, identifier, init_value):
  45. self.add(StaticAttribute(self.get(), identifier, init_value))
  46. def addVSpace(self):
  47. self.add(VSpace())
  48. #### STATEFUL OPERATIONS ####
  49. def begin(self, generic_construct):
  50. self.add(generic_construct)
  51. self.stack.append(generic_construct)
  52. def beginArray(self):
  53. self.begin(ArrayExpression())
  54. def beginClass(self, class_name, super_class_names = None, comment = None):
  55. self.begin(Class(class_name, super_class_names, comment))
  56. def beginConstructor(self):
  57. c = self.get().getConstructor()
  58. self.stack.append(c)
  59. def beginDestructor(self):
  60. d = self.get().getDestructor()
  61. self.stack.append(d)
  62. def beginElse(self):
  63. self.begin(ElseStatement())
  64. def beginElseIf(self, condition):
  65. self.begin(ElseIfStatement(condition, not isinstance(self.last, ElseIfStatement)))
  66. def beginForLoopIterateArray(self, array_expr, iterator_identifier):
  67. f = ForLoopIterateArray(array_expr, iterator_identifier)
  68. self.get().add(f)
  69. self.stack.append(f.getBody())
  70. def beginForLoopIterateMapValues(self, map_expr, iterator_identifier):
  71. f = ForLoopIterateMapValues(map_expr, iterator_identifier)
  72. self.get().add(f)
  73. self.stack.append(f.getBody())
  74. def beginFunctionCall(self, function_expr):
  75. f = FunctionCall(function_expr)
  76. self.get().add(f)
  77. self.stack.append(f)
  78. def beginGlue(self):
  79. g = Glue()
  80. self.get().add(g)
  81. self.stack.append(g)
  82. def beginIf(self, condition):
  83. self.begin(IfStatement(condition))
  84. def beginMethod(self, name, comment = None):
  85. m = Method(self.get(), name, comment)
  86. self.get().add(m)
  87. self.stack.append(m)
  88. def beginMethodBody(self):
  89. b = self.get().getBody()
  90. self.stack.append(b)
  91. def beginPackage(self, package_name):
  92. p = Package(package_name)
  93. self.get().add(p)
  94. self.stack.append(p)
  95. def beginSuperClassConstructorCall(self, super_class_identifier):
  96. c = SuperClassConstructorCall(super_class_identifier)
  97. self.get().add(c)
  98. self.stack.append(c)
  99. def beginSuperClassDestructorCall(self, super_class_identifier):
  100. c = SuperClassDestructorCall(super_class_identifier)
  101. self.get().add(c)
  102. self.stack.append(c)
  103. def beginSuperClassMethodCall(self, super_class_identifier, method_identifier):
  104. c = SuperClassMethodCall(super_class_identifier, method_identifier)
  105. self.get().add(c)
  106. self.stack.append(c)
  107. def end(self):
  108. self.stack.pop()
  109. def endArray(self):
  110. self.last = self.stack.pop()
  111. assert isinstance(self.last, ArrayExpression)
  112. def endClass(self):
  113. self.last = self.stack.pop()
  114. assert isinstance(self.last, Class)
  115. def endConstructor(self):
  116. self.last = self.stack.pop()
  117. assert isinstance(self.last, Constructor)
  118. def endDestructor(self):
  119. self.last = self.stack.pop()
  120. assert isinstance(self.last, Destructor)
  121. def endElse(self):
  122. self.last = self.stack.pop()
  123. assert isinstance(self.last, ElseStatement)
  124. def endElseIf(self):
  125. self.last = self.stack.pop()
  126. assert isinstance(self.last, ElseIfStatement)
  127. def endForLoopIterateArray(self):
  128. self.last = self.stack.pop()
  129. assert isinstance(self.last, ForLoopBody)
  130. def endForLoopIterateMapValues(self):
  131. self.last = self.stack.pop()
  132. assert isinstance(self.last, ForLoopBody)
  133. def endFunctionCall(self):
  134. self.last = self.stack.pop()
  135. assert isinstance(self.last, FunctionCall)
  136. def endGlue(self):
  137. self.last = self.stack.pop()
  138. assert isinstance(self.last, Glue)
  139. def endIf(self):
  140. self.last = self.stack.pop()
  141. assert isinstance(self.last, IfStatement)
  142. def endMethod(self):
  143. self.last = self.stack.pop()
  144. assert isinstance(self.last, Method)
  145. def endMethodBody(self):
  146. self.last = self.stack.pop()
  147. assert isinstance(self.last, MethodBody)
  148. def endPackage(self):
  149. self.last = self.stack.pop()
  150. assert isinstance(self.last, Package)
  151. def endSuperClassConstructorCall(self):
  152. self.last = self.stack.pop()
  153. assert isinstance(self.last, SuperClassConstructorCall)
  154. def endSuperClassDestructorCall(self):
  155. self.last = self.stack.pop()
  156. assert isinstance(self.last, SuperClassDestructorCall)
  157. def endSuperClassMethodCall(self):
  158. self.last = self.stack.pop()
  159. assert isinstance(self.last, SuperClassMethodCall)