1: ================================================================================
  2: 
  3: Smalltalk defineClass: #SynapseParser
  4:     superclass: #{Core.Object}
  5:     indexedType: #none
  6:     private: false
  7:     instanceVariableNames: 'parseStream stateStack nodeStack parseTable programNode '
  8:     classInstanceVariableNames: ''
  9:     imports: ''
 10:     category: ''
 11: 
 12: ================================================================================
 13: 
 14: SynapseParser method for 'private-parsing'
 15: 
 16: _parse
 17: 
 18:     | currentToken currentAction |
 19:     self push: self initialState.
 20:     currentToken := self peekToken.
 21:     currentAction := self parseTable at: self currentState tokenSymbol: currentToken symbol.
 22:     [currentAction isNotCompleted] whileTrue: 
 23:             [| nextAction |
 24:             nextAction := nil.
 25:             currentAction isShift
 26:                 ifTrue: 
 27:                     [nextAction := self parseTable at: self currentState tokenSymbol: currentToken symbol.
 28:                     self push: currentAction nextState.
 29:                     self nextToken.
 30:                     currentToken := self peekToken].
 31:             currentAction isReduce
 32:                 ifTrue: 
 33:                     [self stack removeLast: currentAction reductionSymbols size.
 34:                     nextAction := self parseTable at: self currentState tokenSymbol: currentAction nextSymbol].
 35:             currentAction isAccept ifTrue: [].
 36:             currentAction isError ifTrue: [].
 37:             nextAction ifNotNil: [currentAction := nextAction]]
 38:     "[currentAction isAccept or: [currentAction isError]] whileFalse: []"
 39: 
 40: ------------------------------------------------------------
 41: 
 42: SynapseParser method for 'accessing-stack'
 43: 
 44: currentState
 45: 
 46:     ^self stateStack last
 47: 
 48: ------------------------------------------------------------
 49: 
 50: SynapseParser method for 'defaults'
 51: 
 52: defaultCorrectProgramNodeSymbol
 53: 
 54:     ^#Program
 55: 
 56: ------------------------------------------------------------
 57: 
 58: SynapseParser method for 'defaults'
 59: 
 60: defaultInvalidProgramNodeSymbol
 61: 
 62:     ^#InvalidProgram
 63: 
 64: ------------------------------------------------------------
 65: 
 66: SynapseParser method for 'defaults'
 67: 
 68: initialState
 69: 
 70:     ^#state0
 71: 
 72: ------------------------------------------------------------
 73: 
 74: SynapseParser method for 'accessing-parse'
 75: 
 76: next
 77: 
 78:     ^self parseStream next
 79: 
 80: ------------------------------------------------------------
 81: 
 82: SynapseParser method for 'accessing-parse'
 83: 
 84: nextToken
 85: 
 86:     ^self parseStream nextToken
 87: 
 88: ------------------------------------------------------------
 89: 
 90: SynapseParser method for 'accessing-stack'
 91: 
 92: nodeStack
 93: 
 94:     nodeStack ifNil: [nodeStack := OrderedCollection new].
 95:     ^nodeStack
 96: 
 97: ------------------------------------------------------------
 98: 
 99: SynapseParser method for 'private-parsing'
100: 
101: parse
102: 
103:     | aBoolean |
104:     self pushState: self initialState.
105:     aBoolean := true.
106:     [aBoolean] whileTrue: 
107:             [| currentAction nextAction |
108:             currentAction := self parseTable at: self currentState tokenSymbol: self peekToken symbol.
109:             nextAction := nil.
110:             currentAction isShift
111:                 ifTrue: 
112:                     [self pushState: currentAction nextState.
113:                     self pushNode: (self class defaultParseNodeClass token: self peekToken).
114:                     self nextToken].
115:             currentAction isReduce
116:                 ifTrue: 
117:                     [| numberOfReduction nodeCollection |
118:                     numberOfReduction := currentAction reductionSymbols size.
119:                     self popState: numberOfReduction.
120:                     nodeCollection := self popNode: numberOfReduction.
121:                     self pushNode: (self class defaultParseNodeClass symbol: currentAction nextSymbol subNodes: nodeCollection).
122:                     nextAction := self parseTable at: self currentState tokenSymbol: currentAction nextSymbol.
123:                     self pushState: nextAction nextState].
124:             (currentAction isAccept or: [currentAction isError])
125:                 ifTrue: 
126:                     [| nodeCollection programNodeSymbol parseNodeClass |
127:                     self popAllState.
128:                     nodeCollection := self popAllNode.
129:                     programNodeSymbol := currentAction isAccept
130:                                 ifTrue: [self defaultCorrectProgramNodeSymbol]
131:                                 ifFalse: [self defaultInvalidProgramNodeSymbol].
132:                     parseNodeClass := self class defaultParseNodeClass.
133:                     self programNode: (parseNodeClass symbol: programNodeSymbol subNodes: nodeCollection).
134:                     self pushNode: self programNode].
135:             currentAction isCompleted ifTrue: [aBoolean := false].
136:             nextAction ifNotNil: [currentAction := nextAction]]
137: 
138: ------------------------------------------------------------
139: 
140: SynapseParser method for 'initialize-release'
141: 
142: parseOn: aStream
143: 
144:     self
145:         parseStream: aStream;
146:         parse;
147:         yourself
148: 
149: ------------------------------------------------------------
150: 
151: SynapseParser method for 'accessing-stream'
152: 
153: parseStream
154: 
155:     parseStream ifNil: [parseStream := self class defaultParseStreamClass new].
156:     ^parseStream
157: 
158: ------------------------------------------------------------
159: 
160: SynapseParser method for 'accessing-stream'
161: 
162: parseStream: aStream
163: 
164:     parseStream := aStream
165: 
166: ------------------------------------------------------------
167: 
168: SynapseParser method for 'accessing'
169: 
170: parseTable
171: 
172:     parseTable ifNil: [parseTable := self class defaultParseTableClass new].
173:     ^parseTable
174: 
175: ------------------------------------------------------------
176: 
177: SynapseParser method for 'accessing-parse'
178: 
179: peekToken
180: 
181:     ^self parseStream peekToken
182: 
183: ------------------------------------------------------------
184: 
185: SynapseParser method for 'accessing-stack'
186: 
187: popAllNode
188: 
189:     ^self nodeStack removeAll
190: 
191: ------------------------------------------------------------
192: 
193: SynapseParser method for 'accessing-stack'
194: 
195: popAllState
196: 
197:     ^self stateStack removeAll
198: 
199: ------------------------------------------------------------
200: 
201: SynapseParser method for 'accessing-stack'
202: 
203: popNode
204: 
205:     ^self nodeStack removeLast
206: 
207: ------------------------------------------------------------
208: 
209: SynapseParser method for 'accessing-stack'
210: 
211: popNode: aNumber
212: 
213:     ^self nodeStack removeLast: aNumber
214: 
215: ------------------------------------------------------------
216: 
217: SynapseParser method for 'accessing-stack'
218: 
219: popState
220: 
221:     ^self stateStack removeLast
222: 
223: ------------------------------------------------------------
224: 
225: SynapseParser method for 'accessing-stack'
226: 
227: popState: aNumber
228: 
229:     ^self stateStack removeLast: aNumber
230: 
231: ------------------------------------------------------------
232: 
233: SynapseParser method for 'accessing'
234: 
235: programNode
236: 
237:     ^programNode
238: 
239: ------------------------------------------------------------
240: 
241: SynapseParser method for 'accessing'
242: 
243: programNode: aNode
244: 
245:     programNode := aNode
246: 
247: ------------------------------------------------------------
248: 
249: SynapseParser method for 'accessing-stack'
250: 
251: pushNode: aNode
252: 
253:     self nodeStack addLast: aNode
254: 
255: ------------------------------------------------------------
256: 
257: SynapseParser method for 'accessing-stack'
258: 
259: pushState: stateSymbol
260: 
261:     self stateStack addLast: stateSymbol
262: 
263: ------------------------------------------------------------
264: 
265: SynapseParser method for 'accessing-parse'
266: 
267: reset
268: 
269:     ^self parseStream reset
270: 
271: ------------------------------------------------------------
272: 
273: SynapseParser method for 'accessing-stack'
274: 
275: stateStack
276: 
277:     stateStack ifNil: [stateStack := OrderedCollection new].
278:     ^stateStack
279: 
280: ================================================================================
281: 
282: Smalltalk.SynapseParser class
283:     instanceVariableNames: ''
284: 
285: ================================================================================
286: 
287: SynapseParser class method for 'defaults'
288: 
289: defaultBlockTableClass
290: 
291:     ^KSU.SynapseParseBlockTable
292: 
293: ------------------------------------------------------------
294: 
295: SynapseParser class method for 'defaults'
296: 
297: defaultParseNodeClass
298: 
299:     ^KSU.SynapseParseNode
300: 
301: ------------------------------------------------------------
302: 
303: SynapseParser class method for 'defaults'
304: 
305: defaultParseStreamClass
306: 
307:     ^KSU.SynapseTokenStream
308: 
309: ------------------------------------------------------------
310: 
311: SynapseParser class method for 'defaults'
312: 
313: defaultParseTableClass
314: 
315:     ^KSU.SynapseParseTable
316: 
317: ------------------------------------------------------------
318: 
319: SynapseParser class method for 'examples'
320: 
321: example1
322:     "KSU.SynapseParser example1."
323: 
324:     | aScanner aStream aParser |
325:     aScanner := KSU.SynapseScanner example7.
326:     aStream := KSU.SynapseTokenStream tokens: aScanner tokenCollection.
327:     aParser := KSU.SynapseParser parseOn: aStream.
328:     ^aParser
329: 
330: ------------------------------------------------------------
331: 
332: SynapseParser class method for 'examples'
333: 
334: example2
335:     "KSU.SynapseParser example2."
336: 
337:     | aScanner aStream aParser |
338:     aScanner := KSU.SynapseScanner example5.
339:     aStream := KSU.SynapseTokenStream tokens: aScanner tokenCollection.
340:     aParser := KSU.SynapseParser parseOn: aStream.
341:     ^aParser
342: 
343: ------------------------------------------------------------
344: 
345: SynapseParser class method for 'examples'
346: 
347: example3
348:     "KSU.SynapseParser example3."
349: 
350:     | aScanner aStream aParser |
351:     aScanner := KSU.SynapseScanner example4.
352:     aStream := KSU.SynapseTokenStream tokens: aScanner tokenCollection.
353:     aParser := KSU.SynapseParser parseOn: aStream.
354:     ^aParser
355: 
356: ------------------------------------------------------------
357: 
358: SynapseParser class method for 'instance creation'
359: 
360: new
361: 
362:     ^(super new)
363:         initialize;
364:         yourself
365: 
366: ------------------------------------------------------------
367: 
368: SynapseParser class method for 'instance creation'
369: 
370: parse: tokenCollection
371: 
372:     ^self parseOn: (self defaultParseStreamClass tokens: tokenCollection)
373: 
374: ------------------------------------------------------------
375: 
376: SynapseParser class method for 'instance creation'
377: 
378: parseOn: aStream
379: 
380:     ^(self new)
381:         parseOn: aStream;
382:         yourself
383: 
384: ================================================================================

This document was generated by KSU.TextDoclet on 2013/02/22 at 01:01:17.