Compiler-AST.st 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. Smalltalk current createPackage: 'Compiler-AST' properties: #{}!
  2. Object subclass: #Node
  3. instanceVariableNames: 'nodes'
  4. package: 'Compiler-AST'!
  5. !Node commentStamp!
  6. I am the abstract root class of the abstract syntax tree.!
  7. !Node methodsFor: 'accessing'!
  8. addNode: aNode
  9. self nodes add: aNode
  10. !
  11. nodes
  12. ^nodes ifNil: [nodes := Array new]
  13. ! !
  14. !Node methodsFor: 'building'!
  15. nodes: aCollection
  16. nodes := aCollection
  17. ! !
  18. !Node methodsFor: 'testing'!
  19. isAssignmentNode
  20. ^ false
  21. !
  22. isBlockNode
  23. ^false
  24. !
  25. isBlockSequenceNode
  26. ^false
  27. !
  28. isSendNode
  29. ^false
  30. !
  31. isValueNode
  32. ^false
  33. ! !
  34. !Node methodsFor: 'visiting'!
  35. accept: aVisitor
  36. ^ aVisitor visitNode: self
  37. ! !
  38. Node subclass: #AssignmentNode
  39. instanceVariableNames: 'left right'
  40. package: 'Compiler-AST'!
  41. !AssignmentNode methodsFor: 'accessing'!
  42. left
  43. ^left
  44. !
  45. left: aNode
  46. left := aNode
  47. !
  48. nodes
  49. ^ Array with: self left with: self right
  50. !
  51. right
  52. ^right
  53. !
  54. right: aNode
  55. right := aNode
  56. ! !
  57. !AssignmentNode methodsFor: 'testing'!
  58. isAssignmentNode
  59. ^ true
  60. ! !
  61. !AssignmentNode methodsFor: 'visiting'!
  62. accept: aVisitor
  63. ^ aVisitor visitAssignmentNode: self
  64. ! !
  65. Node subclass: #BlockNode
  66. instanceVariableNames: 'parameters scope'
  67. package: 'Compiler-AST'!
  68. !BlockNode methodsFor: 'accessing'!
  69. parameters
  70. ^parameters ifNil: [parameters := Array new]
  71. !
  72. parameters: aCollection
  73. parameters := aCollection
  74. !
  75. scope
  76. ^ scope
  77. !
  78. scope: aLexicalScope
  79. scope := aLexicalScope
  80. ! !
  81. !BlockNode methodsFor: 'testing'!
  82. isBlockNode
  83. ^true
  84. ! !
  85. !BlockNode methodsFor: 'visiting'!
  86. accept: aVisitor
  87. ^ aVisitor visitBlockNode: self
  88. ! !
  89. Node subclass: #CascadeNode
  90. instanceVariableNames: 'receiver'
  91. package: 'Compiler-AST'!
  92. !CascadeNode methodsFor: 'accessing'!
  93. receiver
  94. ^receiver
  95. !
  96. receiver: aNode
  97. receiver := aNode
  98. ! !
  99. !CascadeNode methodsFor: 'visiting'!
  100. accept: aVisitor
  101. ^ aVisitor visitCascadeNode: self
  102. ! !
  103. Node subclass: #DynamicArrayNode
  104. instanceVariableNames: ''
  105. package: 'Compiler-AST'!
  106. !DynamicArrayNode methodsFor: 'visiting'!
  107. accept: aVisitor
  108. ^ aVisitor visitDynamicArrayNode: self
  109. ! !
  110. Node subclass: #DynamicDictionaryNode
  111. instanceVariableNames: ''
  112. package: 'Compiler-AST'!
  113. !DynamicDictionaryNode methodsFor: 'visiting'!
  114. accept: aVisitor
  115. ^ aVisitor visitDynamicDictionaryNode: self
  116. ! !
  117. Node subclass: #JSStatementNode
  118. instanceVariableNames: 'source'
  119. package: 'Compiler-AST'!
  120. !JSStatementNode methodsFor: 'accessing'!
  121. source
  122. ^source ifNil: ['']
  123. !
  124. source: aString
  125. source := aString
  126. ! !
  127. !JSStatementNode methodsFor: 'visiting'!
  128. accept: aVisitor
  129. ^ aVisitor visitJSStatementNode: self
  130. ! !
  131. Node subclass: #MethodNode
  132. instanceVariableNames: 'selector arguments source scope classReferences messageSends'
  133. package: 'Compiler-AST'!
  134. !MethodNode methodsFor: 'accessing'!
  135. arguments
  136. ^arguments ifNil: [#()]
  137. !
  138. arguments: aCollection
  139. arguments := aCollection
  140. !
  141. classReferences
  142. ^ classReferences
  143. !
  144. classReferences: aCollection
  145. classReferences := aCollection
  146. !
  147. messageSends
  148. ^ messageSends
  149. !
  150. messageSends: aCollection
  151. messageSends := aCollection
  152. !
  153. scope
  154. ^ scope
  155. !
  156. scope: aMethodScope
  157. scope := aMethodScope
  158. !
  159. selector
  160. ^selector
  161. !
  162. selector: aString
  163. selector := aString
  164. !
  165. source
  166. ^source
  167. !
  168. source: aString
  169. source := aString
  170. ! !
  171. !MethodNode methodsFor: 'visiting'!
  172. accept: aVisitor
  173. ^ aVisitor visitMethodNode: self
  174. ! !
  175. Node subclass: #ReturnNode
  176. instanceVariableNames: 'scope'
  177. package: 'Compiler-AST'!
  178. !ReturnNode methodsFor: 'accessing'!
  179. scope
  180. ^ scope
  181. !
  182. scope: aLexicalScope
  183. scope := aLexicalScope
  184. ! !
  185. !ReturnNode methodsFor: 'testing'!
  186. nonLocalReturn
  187. ^ self scope isMethodScope not
  188. ! !
  189. !ReturnNode methodsFor: 'visiting'!
  190. accept: aVisitor
  191. ^ aVisitor visitReturnNode: self
  192. ! !
  193. Node subclass: #SendNode
  194. instanceVariableNames: 'selector arguments receiver superSend'
  195. package: 'Compiler-AST'!
  196. !SendNode methodsFor: 'accessing'!
  197. arguments
  198. ^arguments ifNil: [arguments := #()]
  199. !
  200. arguments: aCollection
  201. arguments := aCollection
  202. !
  203. cascadeNodeWithMessages: aCollection
  204. | first |
  205. first := SendNode new
  206. selector: self selector;
  207. arguments: self arguments;
  208. yourself.
  209. ^CascadeNode new
  210. receiver: self receiver;
  211. nodes: (Array with: first), aCollection;
  212. yourself
  213. !
  214. nodes
  215. ^ (Array withAll: self arguments)
  216. add: self receiver;
  217. yourself
  218. !
  219. receiver
  220. ^receiver
  221. !
  222. receiver: aNode
  223. receiver := aNode
  224. !
  225. selector
  226. ^selector
  227. !
  228. selector: aString
  229. selector := aString
  230. !
  231. superSend
  232. ^ superSend ifNil: [ false ]
  233. !
  234. superSend: aBoolean
  235. superSend := aBoolean
  236. !
  237. valueForReceiver: anObject
  238. ^SendNode new
  239. receiver: (self receiver
  240. ifNil: [anObject]
  241. ifNotNil: [self receiver valueForReceiver: anObject]);
  242. selector: self selector;
  243. arguments: self arguments;
  244. yourself
  245. ! !
  246. !SendNode methodsFor: 'testing'!
  247. isSendNode
  248. ^ true
  249. ! !
  250. !SendNode methodsFor: 'visiting'!
  251. accept: aVisitor
  252. ^ aVisitor visitSendNode: self
  253. ! !
  254. Node subclass: #SequenceNode
  255. instanceVariableNames: 'temps scope'
  256. package: 'Compiler-AST'!
  257. !SequenceNode methodsFor: 'accessing'!
  258. scope
  259. ^ scope
  260. !
  261. scope: aLexicalScope
  262. scope := aLexicalScope
  263. !
  264. temps
  265. ^temps ifNil: [#()]
  266. !
  267. temps: aCollection
  268. temps := aCollection
  269. ! !
  270. !SequenceNode methodsFor: 'testing'!
  271. asBlockSequenceNode
  272. ^BlockSequenceNode new
  273. nodes: self nodes;
  274. temps: self temps;
  275. yourself
  276. ! !
  277. !SequenceNode methodsFor: 'visiting'!
  278. accept: aVisitor
  279. ^ aVisitor visitSequenceNode: self
  280. ! !
  281. SequenceNode subclass: #BlockSequenceNode
  282. instanceVariableNames: ''
  283. package: 'Compiler-AST'!
  284. !BlockSequenceNode methodsFor: 'testing'!
  285. isBlockSequenceNode
  286. ^true
  287. ! !
  288. !BlockSequenceNode methodsFor: 'visiting'!
  289. accept: aVisitor
  290. ^ aVisitor visitBlockSequenceNode: self
  291. ! !
  292. Node subclass: #ValueNode
  293. instanceVariableNames: 'value'
  294. package: 'Compiler-AST'!
  295. !ValueNode methodsFor: 'accessing'!
  296. value
  297. ^value
  298. !
  299. value: anObject
  300. value := anObject
  301. ! !
  302. !ValueNode methodsFor: 'testing'!
  303. isValueNode
  304. ^true
  305. ! !
  306. !ValueNode methodsFor: 'visiting'!
  307. accept: aVisitor
  308. ^ aVisitor visitValueNode: self
  309. ! !
  310. ValueNode subclass: #VariableNode
  311. instanceVariableNames: 'assigned binding'
  312. package: 'Compiler-AST'!
  313. !VariableNode methodsFor: 'accessing'!
  314. alias
  315. ^ self binding alias
  316. !
  317. assigned
  318. ^assigned ifNil: [false]
  319. !
  320. assigned: aBoolean
  321. assigned := aBoolean
  322. !
  323. beAssigned
  324. self binding validateAssignment.
  325. assigned := true
  326. !
  327. binding
  328. ^ binding
  329. !
  330. binding: aScopeVar
  331. binding := aScopeVar
  332. ! !
  333. !VariableNode methodsFor: 'visiting'!
  334. accept: aVisitor
  335. ^ aVisitor visitVariableNode: self
  336. ! !
  337. VariableNode subclass: #ClassReferenceNode
  338. instanceVariableNames: ''
  339. package: 'Compiler-AST'!
  340. !ClassReferenceNode methodsFor: 'visiting'!
  341. accept: aVisitor
  342. ^ aVisitor visitClassReferenceNode: self
  343. ! !