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.