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.