1 // 2 // ANTLRBufferedTreeNodeStream.m 3 // ANTLR 4 // 5 // [The "BSD licence"] 6 // Copyright (c) 2010 Ian Michell 2010 Alan Condit 7 // All rights reserved. 8 // 9 // Redistribution and use in source and binary forms, with or without 10 // modification, are permitted provided that the following conditions 11 // are met: 12 // 1. Redistributions of source code must retain the above copyright 13 // notice, this list of conditions and the following disclaimer. 14 // 2. Redistributions in binary form must reproduce the above copyright 15 // notice, this list of conditions and the following disclaimer in the 16 // documentation and/or other materials provided with the distribution. 17 // 3. The name of the author may not be used to endorse or promote products 18 // derived from this software without specific prior written permission. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 #import "ANTLRBufferedTreeNodeStream.h" 32 #import "ANTLRStreamEnumerator.h" 33 #import "ANTLRCommonTreeAdaptor.h" 34 35 extern NSInteger debug; 36 37 #ifdef DONTUSENOMO 38 @implementation ANTLRTreeStreamIterator 39 + newANTLRTreeStreamIteratorWithNodes:(ANTLRBufferedTreeNodeStream *)theStream 40 { 41 return[[ANTLRTreeStreamIterator alloc] initWithStream:theStream]; 42 } 43 44 - (id) initWithStream:(ANTLRBufferedTreeNodeStream *)theStream 45 { 46 if ((self = [super init]) != nil) { 47 idx = 0; 48 input = theStream; 49 nodes = [theStream getNodes]; 50 } 51 return self; 52 } 53 54 - (BOOL) hasNext 55 { 56 return idx < [nodes count]; 57 } 58 59 - (id) next 60 { 61 NSInteger current = idx; 62 idx++; 63 if (current < [nodes count]) { 64 } 65 return [nodes getEof]; 66 } 67 68 - (void) remove 69 { 70 @throw [ANTLRRuntimeException newException:@"cannot remove nodes from stream"]; 71 } 72 73 @end 74 #endif 75 76 @implementation ANTLRBufferedTreeNodeStream 77 78 @synthesize up; 79 @synthesize down; 80 @synthesize eof; 81 @synthesize nodes; 82 @synthesize root; 83 @synthesize tokens; 84 @synthesize adaptor; 85 @synthesize uniqueNavigationNodes; 86 @synthesize index; 87 @synthesize lastMarker; 88 @synthesize calls; 89 @synthesize e; 90 @synthesize currentSymbol; 91 92 + (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(ANTLRCommonTree *) aTree 93 { 94 return [((ANTLRBufferedTreeNodeStream *)[ANTLRBufferedTreeNodeStream alloc]) initWithTree:(ANTLRCommonTree *)aTree]; 95 } 96 97 + (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)aTree 98 { 99 return [[ANTLRBufferedTreeNodeStream alloc] initWithTreeAdaptor:adaptor Tree:(ANTLRCommonTree *)aTree]; 100 } 101 102 + (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)aTree withBufferSize:(NSInteger)initialBufferSize 103 { 104 return [[ANTLRBufferedTreeNodeStream alloc] initWithTreeAdaptor:adaptor Tree:(ANTLRCommonTree *)aTree WithBufferSize:initialBufferSize]; 105 } 106 107 -(ANTLRBufferedTreeNodeStream *) init 108 { 109 self = [super init]; 110 if (self) { 111 index = -1; 112 uniqueNavigationNodes = NO; 113 root = [[ANTLRCommonTree alloc] init]; 114 // tokens = tree; 115 adaptor = [[[ANTLRCommonTreeAdaptor alloc] init] retain]; 116 nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain]; 117 down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain]; 118 up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain]; 119 eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain]; 120 } 121 return self; 122 } 123 124 - (ANTLRBufferedTreeNodeStream *)initWithTree:(ANTLRCommonTree *) aTree 125 { 126 self = [super init]; 127 if (self) { 128 index = -1; 129 uniqueNavigationNodes = NO; 130 root = aTree; 131 // tokens = aTree; 132 adaptor = [[[ANTLRCommonTreeAdaptor alloc] init] retain]; 133 nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain]; 134 down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain]; 135 up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain]; 136 eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain]; 137 } 138 return self; 139 } 140 141 -(ANTLRBufferedTreeNodeStream *) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(ANTLRCommonTree *)aTree 142 { 143 self = [super init]; 144 if (self) { 145 index = -1; 146 uniqueNavigationNodes = NO; 147 root = aTree; 148 // tokens = aTree; 149 adaptor = [anAdaptor retain]; 150 nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain]; 151 down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain]; 152 up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain]; 153 eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain]; 154 } 155 return self; 156 } 157 158 -(ANTLRBufferedTreeNodeStream *) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(ANTLRCommonTree *)aTree WithBufferSize:(NSInteger)bufferSize 159 { 160 self = [super init]; 161 if (self) { 162 // down = [adaptor createToken:ANTLRTokenTypeDOWN withText:@"DOWN"]; 163 // up = [adaptor createToken:ANTLRTokenTypeDOWN withText:@"UP"]; 164 // eof = [adaptor createToken:ANTLRTokenTypeDOWN withText:@"EOF"]; 165 index = -1; 166 uniqueNavigationNodes = NO; 167 root = aTree; 168 // tokens = aTree; 169 adaptor = [anAdaptor retain]; 170 nodes = [[AMutableArray arrayWithCapacity:bufferSize] retain]; 171 down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain]; 172 up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain]; 173 eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain]; 174 } 175 return self; 176 } 177 178 - (void)dealloc 179 { 180 #ifdef DEBUG_DEALLOC 181 NSLog( @"called dealloc in ANTLRBufferedTreeNodeStream" ); 182 #endif 183 if ( adaptor ) [adaptor release]; 184 if ( nodes ) [nodes release]; 185 if ( root ) [root release]; 186 if ( down ) [down release]; 187 if ( up ) [up release]; 188 if ( eof ) [eof release]; 189 [super dealloc]; 190 } 191 192 - (id) copyWithZone:(NSZone *)aZone 193 { 194 ANTLRBufferedTreeNodeStream *copy; 195 196 copy = [[[self class] allocWithZone:aZone] init]; 197 if ( up ) 198 copy.up = [up copyWithZone:aZone]; 199 if ( down ) 200 copy.down = [down copyWithZone:aZone]; 201 if ( eof ) 202 copy.eof = [eof copyWithZone:aZone]; 203 if ( nodes ) 204 copy.nodes = [nodes copyWithZone:aZone]; 205 if ( root ) 206 copy.root = [root copyWithZone:aZone]; 207 if ( tokens ) 208 copy.tokens = [tokens copyWithZone:aZone]; 209 if ( adaptor ) 210 copy.adaptor = [adaptor copyWithZone:aZone]; 211 copy.uniqueNavigationNodes = self.uniqueNavigationNodes; 212 copy.index = self.index; 213 copy.lastMarker = self.lastMarker; 214 if ( calls ) 215 copy.calls = [calls copyWithZone:aZone]; 216 return copy; 217 } 218 219 // protected methods. DO NOT USE 220 #pragma mark Protected Methods 221 -(void) fillBuffer 222 { 223 [self fillBufferWithTree:root]; 224 // if (debug > 1) NSLog("revIndex=%@", tokenTypeToStreamIndexesMap); 225 index = 0; // buffer of nodes intialized now 226 } 227 228 -(void) fillBufferWithTree:(ANTLRCommonTree *) aTree 229 { 230 BOOL empty = [adaptor isNil:aTree]; 231 if (!empty) { 232 [nodes addObject:aTree]; 233 } 234 NSInteger n = [adaptor getChildCount:aTree]; 235 if (!empty && n > 0) { 236 [self addNavigationNode:ANTLRTokenTypeDOWN]; 237 } 238 for (NSInteger c = 0; c < n; c++) { 239 id child = [adaptor getChild:aTree At:c]; 240 [self fillBufferWithTree:child]; 241 } 242 if (!empty && n > 0) { 243 [self addNavigationNode:ANTLRTokenTypeUP]; 244 } 245 } 246 247 -(NSInteger) getNodeIndex:(ANTLRCommonTree *) node 248 { 249 if (index == -1) { 250 [self fillBuffer]; 251 } 252 for (NSUInteger i = 0; i < [nodes count]; i++) { 253 id t = [nodes objectAtIndex:i]; 254 if (t == node) { 255 return i; 256 } 257 } 258 return -1; 259 } 260 261 -(void) addNavigationNode:(NSInteger) type 262 { 263 id navNode = nil; 264 if (type == ANTLRTokenTypeDOWN) { 265 if (self.uniqueNavigationNodes) { 266 navNode = [adaptor createToken:ANTLRTokenTypeDOWN Text:@"DOWN"]; 267 } 268 else { 269 navNode = down; 270 } 271 272 } 273 else { 274 if (self.uniqueNavigationNodes) { 275 navNode = [adaptor createToken:ANTLRTokenTypeUP Text:@"UP"]; 276 } 277 else { 278 navNode = up; 279 } 280 } 281 [nodes addObject:navNode]; 282 } 283 284 -(id) getNode:(NSUInteger) i 285 { 286 if (index == -1) { 287 [self fillBuffer]; 288 } 289 return [nodes objectAtIndex:i]; 290 } 291 292 -(id) LT:(NSInteger) k 293 { 294 if (index == -1) { 295 [self fillBuffer]; 296 } 297 if (k == 0) { 298 return nil; 299 } 300 if (k < 0) { 301 return [self LB:-k]; 302 } 303 if ((index + k - 1) >= [nodes count]) { 304 return eof; 305 } 306 return [nodes objectAtIndex:(index + k - 1)]; 307 } 308 309 -(id) getCurrentSymbol 310 { 311 return [self LT:1]; 312 } 313 314 -(id) LB:(NSInteger) k 315 { 316 if (k == 0) { 317 return nil; 318 } 319 if ((index - k) < 0) { 320 return nil; 321 } 322 return [nodes objectAtIndex:(index - k)]; 323 } 324 325 - (ANTLRCommonTree *)getTreeSource 326 { 327 return root; 328 } 329 330 -(NSString *)getSourceName 331 { 332 return [[self getTokenStream] getSourceName]; 333 } 334 335 - (id<ANTLRTokenStream>)getTokenStream 336 { 337 return tokens; 338 } 339 340 - (void) setTokenStream:(id<ANTLRTokenStream>)newtokens 341 { 342 tokens = newtokens; 343 } 344 345 - (id<ANTLRTreeAdaptor>)getTreeAdaptor 346 { 347 return adaptor; 348 } 349 350 - (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor 351 { 352 adaptor = anAdaptor; 353 } 354 355 - (BOOL)getUniqueNavigationNodes 356 { 357 return uniqueNavigationNodes; 358 } 359 360 - (void) setUniqueNavigationNodes:(BOOL)aVal 361 { 362 uniqueNavigationNodes = aVal; 363 } 364 365 -(void) consume 366 { 367 if (index == -1) { 368 [self fillBuffer]; 369 } 370 index++; 371 } 372 373 -(NSInteger) LA:(NSInteger) i 374 { 375 return [adaptor getType:[self LT:i]]; 376 } 377 378 -(NSInteger) mark 379 { 380 if (index == -1) { 381 [self fillBuffer]; 382 } 383 lastMarker = self.index; 384 return lastMarker; 385 } 386 387 -(void) release:(NSInteger) marker 388 { 389 // do nothing 390 } 391 392 -(void) rewind:(NSInteger) marker 393 { 394 [self seek:marker]; 395 } 396 397 -(void) rewind 398 { 399 [self seek:lastMarker]; 400 } 401 402 -(void) seek:(NSInteger) i 403 { 404 if (index == -1) { 405 [self fillBuffer]; 406 } 407 index = i; 408 } 409 410 -(void) push:(NSInteger) i 411 { 412 if (calls == nil) { 413 calls = [ANTLRIntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE]; 414 } 415 [calls push:index]; 416 [self seek:i]; 417 } 418 419 -(NSInteger) pop 420 { 421 NSInteger ret = [calls pop]; 422 [self seek:ret]; 423 return ret; 424 } 425 426 -(void) reset 427 { 428 index = 0; 429 lastMarker = 0; 430 if (calls != nil) { 431 [calls reset]; 432 } 433 } 434 435 -(NSUInteger) count 436 { 437 if (index == -1) { 438 [self fillBuffer]; 439 } 440 return [nodes count]; 441 } 442 443 -(NSUInteger) size 444 { 445 return [self count]; 446 } 447 448 -(NSEnumerator *) objectEnumerator 449 { 450 if (e == nil) { 451 e = [[ANTLRStreamEnumerator alloc] initWithNodes:nodes andEOF:eof]; 452 } 453 return e; 454 } 455 456 -(void) replaceChildren:(ANTLRCommonTree *) parent From:(NSInteger)startIdx To:(NSInteger)stopIdx With:(ANTLRCommonTree *)aTree 457 { 458 if (parent != nil) { 459 [adaptor replaceChildren:parent From:startIdx To:stopIdx With:aTree]; 460 } 461 } 462 463 -(NSString *) toTokenTypeString 464 { 465 if (index == -1) 466 { 467 [self fillBuffer]; 468 } 469 NSMutableString *buf = [NSMutableString stringWithCapacity:10]; 470 for (NSUInteger i= 0; i < [nodes count]; i++) { 471 ANTLRCommonTree * aTree = (ANTLRCommonTree *)[self getNode:i]; 472 [buf appendFormat:@" %d", [adaptor getType:aTree]]; 473 } 474 return buf; 475 } 476 477 -(NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop 478 { 479 if (index == -1) { 480 [self fillBuffer]; 481 } 482 NSMutableString *buf = [NSMutableString stringWithCapacity:10]; 483 for (NSUInteger i = aStart; i < [nodes count] && i <= aStop; i++) { 484 ANTLRCommonTree * t = (ANTLRCommonTree *)[self getNode:i]; 485 [buf appendFormat:@" %d", [adaptor getType:t]]; 486 } 487 return buf; 488 } 489 490 -(NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop 491 { 492 if (aStart == nil || aStop == nil) { 493 return nil; 494 } 495 if (index == -1) { 496 [self fillBuffer]; 497 } 498 499 // if we have a token stream, use that to dump text in order 500 if ([self getTokenStream] != nil) { 501 NSInteger beginTokenIndex = [adaptor getTokenStartIndex:aStart]; 502 NSInteger endTokenIndex = [adaptor getTokenStopIndex:aStop]; 503 504 if ([adaptor getType:aStop] == ANTLRTokenTypeUP) { 505 endTokenIndex = [adaptor getTokenStopIndex:aStart]; 506 } 507 else if ([adaptor getType:aStop] == ANTLRTokenTypeEOF) { 508 endTokenIndex = [self count] - 2; //don't use EOF 509 } 510 [tokens toStringFromStart:beginTokenIndex ToEnd:endTokenIndex]; 511 } 512 // walk nodes looking for aStart 513 ANTLRCommonTree * aTree = nil; 514 NSUInteger i = 0; 515 for (; i < [nodes count]; i++) { 516 aTree = [nodes objectAtIndex:i]; 517 if (aTree == aStart) { 518 break; 519 } 520 } 521 NSMutableString *buf = [NSMutableString stringWithCapacity:10]; 522 aTree = [nodes objectAtIndex:i]; // why? 523 while (aTree != aStop) { 524 NSString *text = [adaptor getText:aTree]; 525 if (text == nil) { 526 text = [NSString stringWithFormat:@" %d", [adaptor getType:aTree]]; 527 } 528 [buf appendString:text]; 529 i++; 530 aTree = [nodes objectAtIndex:i]; 531 } 532 NSString *text = [adaptor getText:aStop]; 533 if (text == nil) { 534 text = [NSString stringWithFormat:@" %d", [adaptor getType:aStop]]; 535 } 536 [buf appendString:text]; 537 return buf; 538 } 539 540 // getters and setters 541 - (AMutableArray *) getNodes 542 { 543 return nodes; 544 } 545 546 - (id) eof 547 { 548 return eof; 549 } 550 551 - (void) setEof:(id)theEOF 552 { 553 eof = theEOF; 554 } 555 556 @end 557