1 /// \file 2 /// Default implementation of CommonTokenStream 3 /// 4 5 // [The "BSD licence"] 6 // Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 7 // http://www.temporal-wave.com 8 // http://www.linkedin.com/in/jimidle 9 // 10 // All rights reserved. 11 // 12 // Redistribution and use in source and binary forms, with or without 13 // modification, are permitted provided that the following conditions 14 // are met: 15 // 1. Redistributions of source code must retain the above copyright 16 // notice, this list of conditions and the following disclaimer. 17 // 2. Redistributions in binary form must reproduce the above copyright 18 // notice, this list of conditions and the following disclaimer in the 19 // documentation and/or other materials provided with the distribution. 20 // 3. The name of the author may not be used to endorse or promote products 21 // derived from this software without specific prior written permission. 22 // 23 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 34 #include <antlr3tokenstream.h> 35 36 #ifdef ANTLR3_WINDOWS 37 #pragma warning( disable : 4100 ) 38 #endif 39 40 // COMMON_TOKEN_STREAM API 41 // 42 static void setTokenTypeChannel (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_UINT32 ttype, ANTLR3_UINT32 channel); 43 static void discardTokenType (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_INT32 ttype); 44 static void discardOffChannel (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_BOOLEAN discard); 45 static pANTLR3_VECTOR getTokens (pANTLR3_COMMON_TOKEN_STREAM cts); 46 static pANTLR3_LIST getTokenRange (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_UINT32 start, ANTLR3_UINT32 stop); 47 static pANTLR3_LIST getTokensSet (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_UINT32 start, ANTLR3_UINT32 stop, pANTLR3_BITSET types); 48 static pANTLR3_LIST getTokensList (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_UINT32 start, ANTLR3_UINT32 stop, pANTLR3_LIST list); 49 static pANTLR3_LIST getTokensType (pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_UINT32 start, ANTLR3_UINT32 stop, ANTLR3_UINT32 type); 50 static void reset (pANTLR3_COMMON_TOKEN_STREAM cts); 51 52 // TOKEN_STREAM API 53 // 54 static pANTLR3_COMMON_TOKEN tokLT (pANTLR3_TOKEN_STREAM ts, ANTLR3_INT32 k); 55 static pANTLR3_COMMON_TOKEN dbgTokLT (pANTLR3_TOKEN_STREAM ts, ANTLR3_INT32 k); 56 static pANTLR3_COMMON_TOKEN get (pANTLR3_TOKEN_STREAM ts, ANTLR3_UINT32 i); 57 static pANTLR3_TOKEN_SOURCE getTokenSource (pANTLR3_TOKEN_STREAM ts); 58 static void setTokenSource (pANTLR3_TOKEN_STREAM ts, pANTLR3_TOKEN_SOURCE tokenSource); 59 static pANTLR3_STRING toString (pANTLR3_TOKEN_STREAM ts); 60 static pANTLR3_STRING toStringSS (pANTLR3_TOKEN_STREAM ts, ANTLR3_UINT32 start, ANTLR3_UINT32 stop); 61 static pANTLR3_STRING toStringTT (pANTLR3_TOKEN_STREAM ts, pANTLR3_COMMON_TOKEN start, pANTLR3_COMMON_TOKEN stop); 62 static void setDebugListener (pANTLR3_TOKEN_STREAM ts, pANTLR3_DEBUG_EVENT_LISTENER debugger); 63 64 // INT STREAM API 65 // 66 static void consume (pANTLR3_INT_STREAM is); 67 static void dbgConsume (pANTLR3_INT_STREAM is); 68 static ANTLR3_UINT32 _LA (pANTLR3_INT_STREAM is, ANTLR3_INT32 i); 69 static ANTLR3_UINT32 dbgLA (pANTLR3_INT_STREAM is, ANTLR3_INT32 i); 70 static ANTLR3_MARKER mark (pANTLR3_INT_STREAM is); 71 static ANTLR3_MARKER dbgMark (pANTLR3_INT_STREAM is); 72 static void release (pANTLR3_INT_STREAM is, ANTLR3_MARKER mark); 73 static ANTLR3_UINT32 size (pANTLR3_INT_STREAM is); 74 static ANTLR3_MARKER tindex (pANTLR3_INT_STREAM is); 75 static void rewindStream (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker); 76 static void dbgRewindStream (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker); 77 static void rewindLast (pANTLR3_INT_STREAM is); 78 static void dbgRewindLast (pANTLR3_INT_STREAM is); 79 static void seek (pANTLR3_INT_STREAM is, ANTLR3_MARKER index); 80 static void dbgSeek (pANTLR3_INT_STREAM is, ANTLR3_MARKER index); 81 static pANTLR3_STRING getSourceName (pANTLR3_INT_STREAM is); 82 static void antlr3TokenStreamFree (pANTLR3_TOKEN_STREAM stream); 83 static void antlr3CTSFree (pANTLR3_COMMON_TOKEN_STREAM stream); 84 85 // Helpers 86 // 87 static void fillBuffer (pANTLR3_COMMON_TOKEN_STREAM tokenStream); 88 static ANTLR3_UINT32 skipOffTokenChannels (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_INT32 i); 89 static ANTLR3_UINT32 skipOffTokenChannelsReverse (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_INT32 i); 90 static pANTLR3_COMMON_TOKEN LB (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_INT32 i); 91 92 ANTLR3_API pANTLR3_TOKEN_STREAM 93 antlr3TokenStreamNew() 94 { 95 pANTLR3_TOKEN_STREAM stream; 96 97 // Memory for the interface structure 98 // 99 stream = (pANTLR3_TOKEN_STREAM) ANTLR3_MALLOC(sizeof(ANTLR3_TOKEN_STREAM)); 100 101 if (stream == NULL) 102 { 103 return NULL; 104 } 105 106 // Install basic API 107 // 108 stream->free = antlr3TokenStreamFree; 109 110 111 return stream; 112 } 113 114 static void 115 antlr3TokenStreamFree(pANTLR3_TOKEN_STREAM stream) 116 { 117 ANTLR3_FREE(stream); 118 } 119 120 static void 121 antlr3CTSFree (pANTLR3_COMMON_TOKEN_STREAM stream) 122 { 123 // We only free up our subordinate interfaces if they belong 124 // to us, otherwise we let whoever owns them deal with them. 125 // 126 if (stream->tstream->super == stream) 127 { 128 if (stream->tstream->istream->super == stream->tstream) 129 { 130 stream->tstream->istream->free(stream->tstream->istream); 131 stream->tstream->istream = NULL; 132 } 133 stream->tstream->free(stream->tstream); 134 } 135 136 // Now we free our own resources 137 // 138 if (stream->tokens != NULL) 139 { 140 stream->tokens->free(stream->tokens); 141 stream->tokens = NULL; 142 } 143 if (stream->discardSet != NULL) 144 { 145 stream->discardSet->free(stream->discardSet); 146 stream->discardSet = NULL; 147 } 148 if (stream->channelOverrides != NULL) 149 { 150 stream->channelOverrides->free(stream->channelOverrides); 151 stream->channelOverrides = NULL; 152 } 153 154 // Free our memory now 155 // 156 ANTLR3_FREE(stream); 157 } 158 159 // Reset a token stream so it can be used again and can reuse it's 160 // resources. 161 // 162 static void 163 reset (pANTLR3_COMMON_TOKEN_STREAM cts) 164 { 165 166 // Free any resources that ar most like specifc to the 167 // run we just did. 168 // 169 if (cts->discardSet != NULL) 170 { 171 cts->discardSet->free(cts->discardSet); 172 cts->discardSet = NULL; 173 } 174 if (cts->channelOverrides != NULL) 175 { 176 cts->channelOverrides->free(cts->channelOverrides); 177 cts->channelOverrides = NULL; 178 } 179 180 // Now, if there were any existing tokens in the stream, 181 // then we just reset the vector count so that it starts 182 // again. We must traverse the entries unfortunately as 183 // there may be free pointers for custom token types and 184 // so on. However that is just a quick NULL check on the 185 // vector entries. 186 // 187 if (cts->tokens != NULL) 188 { 189 cts->tokens->clear(cts->tokens); 190 } 191 else 192 { 193 /* Install the token tracking tables 194 */ 195 cts->tokens = antlr3VectorNew(0); 196 } 197 198 // Reset to defaults 199 // 200 cts->discardOffChannel = ANTLR3_FALSE; 201 cts->channel = ANTLR3_TOKEN_DEFAULT_CHANNEL; 202 cts->p = -1; 203 } 204 205 ANTLR3_API pANTLR3_COMMON_TOKEN_STREAM 206 antlr3CommonTokenDebugStreamSourceNew(ANTLR3_UINT32 hint, pANTLR3_TOKEN_SOURCE source, pANTLR3_DEBUG_EVENT_LISTENER debugger) 207 { 208 pANTLR3_COMMON_TOKEN_STREAM stream; 209 210 // Create a standard token stream 211 // 212 stream = antlr3CommonTokenStreamSourceNew(hint, source); 213 214 // Install the debugger object 215 // 216 stream->tstream->debugger = debugger; 217 218 // Override standard token stream methods with debugging versions 219 // 220 stream->tstream->initialStreamState = ANTLR3_FALSE; 221 222 stream->tstream->_LT = dbgTokLT; 223 224 stream->tstream->istream->consume = dbgConsume; 225 stream->tstream->istream->_LA = dbgLA; 226 stream->tstream->istream->mark = dbgMark; 227 stream->tstream->istream->rewind = dbgRewindStream; 228 stream->tstream->istream->rewindLast = dbgRewindLast; 229 stream->tstream->istream->seek = dbgSeek; 230 231 return stream; 232 } 233 234 ANTLR3_API pANTLR3_COMMON_TOKEN_STREAM 235 antlr3CommonTokenStreamSourceNew(ANTLR3_UINT32 hint, pANTLR3_TOKEN_SOURCE source) 236 { 237 pANTLR3_COMMON_TOKEN_STREAM stream; 238 239 stream = antlr3CommonTokenStreamNew(hint); 240 241 stream->channel = ANTLR3_TOKEN_DEFAULT_CHANNEL; 242 243 stream->channelOverrides = NULL; 244 stream->discardSet = NULL; 245 stream->discardOffChannel = ANTLR3_FALSE; 246 247 stream->tstream->setTokenSource(stream->tstream, source); 248 249 stream->free = antlr3CTSFree; 250 return stream; 251 } 252 253 ANTLR3_API pANTLR3_COMMON_TOKEN_STREAM 254 antlr3CommonTokenStreamNew(ANTLR3_UINT32 hint) 255 { 256 pANTLR3_COMMON_TOKEN_STREAM stream; 257 258 /* Memory for the interface structure 259 */ 260 stream = (pANTLR3_COMMON_TOKEN_STREAM) ANTLR3_MALLOC(sizeof(ANTLR3_COMMON_TOKEN_STREAM)); 261 262 if (stream == NULL) 263 { 264 return NULL; 265 } 266 267 /* Create space for the token stream interface 268 */ 269 stream->tstream = antlr3TokenStreamNew(); 270 stream->tstream->super = stream; 271 272 /* Create space for the INT_STREAM interfacce 273 */ 274 stream->tstream->istream = antlr3IntStreamNew(); 275 stream->tstream->istream->super = (stream->tstream); 276 stream->tstream->istream->type = ANTLR3_TOKENSTREAM; 277 278 /* Install the token tracking tables 279 */ 280 stream->tokens = antlr3VectorNew(0); 281 282 /* Defaults 283 */ 284 stream->p = -1; 285 286 /* Install the common token stream API 287 */ 288 stream->setTokenTypeChannel = setTokenTypeChannel; 289 stream->discardTokenType = discardTokenType; 290 stream->discardOffChannelToks = discardOffChannel; 291 stream->getTokens = getTokens; 292 stream->getTokenRange = getTokenRange; 293 stream->getTokensSet = getTokensSet; 294 stream->getTokensList = getTokensList; 295 stream->getTokensType = getTokensType; 296 stream->reset = reset; 297 298 /* Install the token stream API 299 */ 300 stream->tstream->_LT = tokLT; 301 stream->tstream->get = get; 302 stream->tstream->getTokenSource = getTokenSource; 303 stream->tstream->setTokenSource = setTokenSource; 304 stream->tstream->toString = toString; 305 stream->tstream->toStringSS = toStringSS; 306 stream->tstream->toStringTT = toStringTT; 307 stream->tstream->setDebugListener = setDebugListener; 308 309 /* Install INT_STREAM interface 310 */ 311 stream->tstream->istream->_LA = _LA; 312 stream->tstream->istream->mark = mark; 313 stream->tstream->istream->release = release; 314 stream->tstream->istream->size = size; 315 stream->tstream->istream->index = tindex; 316 stream->tstream->istream->rewind = rewindStream; 317 stream->tstream->istream->rewindLast= rewindLast; 318 stream->tstream->istream->seek = seek; 319 stream->tstream->istream->consume = consume; 320 stream->tstream->istream->getSourceName = getSourceName; 321 322 return stream; 323 } 324 325 // Install a debug listener adn switch to debug mode methods 326 // 327 static void 328 setDebugListener (pANTLR3_TOKEN_STREAM ts, pANTLR3_DEBUG_EVENT_LISTENER debugger) 329 { 330 // Install the debugger object 331 // 332 ts->debugger = debugger; 333 334 // Override standard token stream methods with debugging versions 335 // 336 ts->initialStreamState = ANTLR3_FALSE; 337 338 ts->_LT = dbgTokLT; 339 340 ts->istream->consume = dbgConsume; 341 ts->istream->_LA = dbgLA; 342 ts->istream->mark = dbgMark; 343 ts->istream->rewind = dbgRewindStream; 344 ts->istream->rewindLast = dbgRewindLast; 345 ts->istream->seek = dbgSeek; 346 } 347 348 /** Get the ith token from the current position 1..n where k=1 is the 349 * first symbol of lookahead. 350 */ 351 static pANTLR3_COMMON_TOKEN 352 tokLT (pANTLR3_TOKEN_STREAM ts, ANTLR3_INT32 k) 353 { 354 ANTLR3_INT32 i; 355 ANTLR3_INT32 n; 356 pANTLR3_COMMON_TOKEN_STREAM cts; 357 358 cts = (pANTLR3_COMMON_TOKEN_STREAM)ts->super; 359 360 if (k < 0) 361 { 362 return LB(cts, -k); 363 } 364 365 if (cts->p == -1) 366 { 367 fillBuffer(cts); 368 } 369 370 // Here we used to check for k == 0 and return 0, but this seems 371 // a superfluous check to me. LT(k=0) is therefore just undefined 372 // and we won't waste the clock cycles on the check 373 // 374 375 if ((cts->p + k - 1) >= (ANTLR3_INT32)ts->istream->cachedSize) 376 { 377 pANTLR3_COMMON_TOKEN teof = &(ts->tokenSource->eofToken); 378 379 teof->setStartIndex (teof, ts->istream->index (ts->istream)); 380 teof->setStopIndex (teof, ts->istream->index (ts->istream)); 381 return teof; 382 } 383 384 i = cts->p; 385 n = 1; 386 387 /* Need to find k good tokens, skipping ones that are off channel 388 */ 389 while ( n < k) 390 { 391 /* Skip off-channel tokens */ 392 i = skipOffTokenChannels(cts, i+1); /* leave p on valid token */ 393 n++; 394 } 395 if ( (ANTLR3_UINT32) i >= ts->istream->cachedSize) 396 { 397 pANTLR3_COMMON_TOKEN teof = &(ts->tokenSource->eofToken); 398 399 teof->setStartIndex (teof, ts->istream->index(ts->istream)); 400 teof->setStopIndex (teof, ts->istream->index(ts->istream)); 401 return teof; 402 } 403 404 // Here the token must be in the input vector. Rather then incur 405 // function call penalty, we just return the pointer directly 406 // from the vector 407 // 408 return (pANTLR3_COMMON_TOKEN)cts->tokens->elements[i].element; 409 //return (pANTLR3_COMMON_TOKEN)cts->tokens->get(cts->tokens, i); 410 } 411 412 /// Debug only method to flag consumption of initial off-channel 413 /// tokens in the input stream 414 /// 415 static void 416 consumeInitialHiddenTokens(pANTLR3_INT_STREAM is) 417 { 418 ANTLR3_MARKER first; 419 ANTLR3_INT32 i; 420 pANTLR3_TOKEN_STREAM ts; 421 422 ts = (pANTLR3_TOKEN_STREAM) is->super; 423 first = is->index(is); 424 425 for (i=0; i<first; i++) 426 { 427 ts->debugger->consumeHiddenToken(ts->debugger, ts->get(ts, i)); 428 } 429 430 ts->initialStreamState = ANTLR3_FALSE; 431 432 } 433 434 /// As per the normal tokLT but sends information to the debugger 435 /// 436 static pANTLR3_COMMON_TOKEN 437 dbgTokLT (pANTLR3_TOKEN_STREAM ts, ANTLR3_INT32 k) 438 { 439 if (ts->initialStreamState == ANTLR3_TRUE) 440 { 441 consumeInitialHiddenTokens(ts->istream); 442 } 443 return tokLT(ts, k); 444 } 445 446 #ifdef ANTLR3_WINDOWS 447 /* When fully optimized VC7 complains about non reachable code. 448 * Not yet sure if this is an optimizer bug, or a bug in the flow analysis 449 */ 450 #pragma warning( disable : 4702 ) 451 #endif 452 453 static pANTLR3_COMMON_TOKEN 454 LB(pANTLR3_COMMON_TOKEN_STREAM cts, ANTLR3_INT32 k) 455 { 456 ANTLR3_INT32 i; 457 ANTLR3_INT32 n; 458 459 if (cts->p == -1) 460 { 461 fillBuffer(cts); 462 } 463 if (k == 0) 464 { 465 return NULL; 466 } 467 if ((cts->p - k) < 0) 468 { 469 return NULL; 470 } 471 472 i = cts->p; 473 n = 1; 474 475 /* Need to find k good tokens, going backwards, skipping ones that are off channel 476 */ 477 while (n <= (ANTLR3_INT32) k) 478 { 479 /* Skip off-channel tokens 480 */ 481 482 i = skipOffTokenChannelsReverse(cts, i - 1); /* leave p on valid token */ 483 n++; 484 } 485 if (i < 0) 486 { 487 return NULL; 488 } 489 // Here the token must be in the input vector. Rather then incut 490 // function call penalty, we jsut return the pointer directly 491 // from the vector 492 // 493 return (pANTLR3_COMMON_TOKEN)cts->tokens->elements[i].element; 494 } 495 496 static pANTLR3_COMMON_TOKEN 497 get (pANTLR3_TOKEN_STREAM ts, ANTLR3_UINT32 i) 498 { 499 pANTLR3_COMMON_TOKEN_STREAM cts; 500 501 cts = (pANTLR3_COMMON_TOKEN_STREAM)ts->super; 502 503 return (pANTLR3_COMMON_TOKEN)(cts->tokens->get(cts->tokens, i)); /* Token index is zero based but vectors are 1 based */ 504 } 505 506 static pANTLR3_TOKEN_SOURCE 507 getTokenSource (pANTLR3_TOKEN_STREAM ts) 508 { 509 return ts->tokenSource; 510 } 511 512 static void 513 setTokenSource ( pANTLR3_TOKEN_STREAM ts, 514 pANTLR3_TOKEN_SOURCE tokenSource) 515 { 516 ts->tokenSource = tokenSource; 517 } 518 519 static pANTLR3_STRING 520 toString (pANTLR3_TOKEN_STREAM ts) 521 { 522 pANTLR3_COMMON_TOKEN_STREAM cts; 523 524 cts = (pANTLR3_COMMON_TOKEN_STREAM)ts->super; 525 526 if (cts->p == -1) 527 { 528 fillBuffer(cts); 529 } 530 531 return ts->toStringSS(ts, 0, ts->istream->size(ts->istream)); 532 } 533 534 static pANTLR3_STRING 535 toStringSS(pANTLR3_TOKEN_STREAM ts, ANTLR3_UINT32 start, ANTLR3_UINT32 stop) 536 { 537 pANTLR3_STRING string; 538 pANTLR3_TOKEN_SOURCE tsource; 539 pANTLR3_COMMON_TOKEN tok; 540 ANTLR3_UINT32 i; 541 pANTLR3_COMMON_TOKEN_STREAM cts; 542 543 cts = (pANTLR3_COMMON_TOKEN_STREAM) ts->super; 544 545 if (cts->p == -1) 546 { 547 fillBuffer(cts); 548 } 549 if (stop >= ts->istream->size(ts->istream)) 550 { 551 stop = ts->istream->size(ts->istream) - 1; 552 } 553 554 /* Who is giving us these tokens? 555 */ 556 tsource = ts->getTokenSource(ts); 557 558 if (tsource != NULL && cts->tokens != NULL) 559 { 560 /* Finally, let's get a string 561 */ 562 string = tsource->strFactory->newRaw(tsource->strFactory); 563 564 for (i = start; i <= stop; i++) 565 { 566 tok = ts->get(ts, i); 567 if (tok != NULL) 568 { 569 string->appendS(string, tok->getText(tok)); 570 } 571 } 572 573 return string; 574 } 575 return NULL; 576 577 } 578 579 static pANTLR3_STRING 580 toStringTT (pANTLR3_TOKEN_STREAM ts, pANTLR3_COMMON_TOKEN start, pANTLR3_COMMON_TOKEN stop) 581 { 582 if (start != NULL && stop != NULL) 583 { 584 return ts->toStringSS(ts, (ANTLR3_UINT32)start->getTokenIndex(start), (ANTLR3_UINT32)stop->getTokenIndex(stop)); 585 } 586 else 587 { 588 return NULL; 589 } 590 } 591 592 /** Move the input pointer to the next incoming token. The stream 593 * must become active with LT(1) available. consume() simply 594 * moves the input pointer so that LT(1) points at the next 595 * input symbol. Consume at least one token. 596 * 597 * Walk past any token not on the channel the parser is listening to. 598 */ 599 static void 600 consume (pANTLR3_INT_STREAM is) 601 { 602 pANTLR3_COMMON_TOKEN_STREAM cts; 603 pANTLR3_TOKEN_STREAM ts; 604 605 ts = (pANTLR3_TOKEN_STREAM) is->super; 606 cts = (pANTLR3_COMMON_TOKEN_STREAM) ts->super; 607 608 if ((ANTLR3_UINT32)cts->p < cts->tokens->count) 609 { 610 cts->p++; 611 cts->p = skipOffTokenChannels(cts, cts->p); 612 } 613 } 614 615 616 /// As per ordinary consume but notifies the debugger about hidden 617 /// tokens and so on. 618 /// 619 static void 620 dbgConsume (pANTLR3_INT_STREAM is) 621 { 622 pANTLR3_TOKEN_STREAM ts; 623 ANTLR3_MARKER a; 624 ANTLR3_MARKER b; 625 pANTLR3_COMMON_TOKEN t; 626 627 ts = (pANTLR3_TOKEN_STREAM) is->super; 628 629 if (ts->initialStreamState == ANTLR3_TRUE) 630 { 631 consumeInitialHiddenTokens(is); 632 } 633 634 a = is->index(is); // Where are we right now? 635 t = ts->_LT(ts, 1); // Current token from stream 636 637 consume(is); // Standard consumer 638 639 b = is->index(is); // Where are we after consuming 1 on channel token? 640 641 ts->debugger->consumeToken(ts->debugger, t); // Tell the debugger that we consumed the first token 642 643 if (b>a+1) 644 { 645 // The standard consume caused the index to advance by more than 1, 646 // which can only happen if it skipped some off-channel tokens. 647 // we need to tell the debugger about those tokens. 648 // 649 ANTLR3_MARKER i; 650 651 for (i = a+1; i<b; i++) 652 { 653 ts->debugger->consumeHiddenToken(ts->debugger, ts->get(ts, (ANTLR3_UINT32)i)); 654 } 655 656 } 657 } 658 659 /** A simple filter mechanism whereby you can tell this token stream 660 * to force all tokens of type ttype to be on channel. For example, 661 * when interpreting, we cannot execute actions so we need to tell 662 * the stream to force all WS and NEWLINE to be a different, ignored, 663 * channel. 664 */ 665 static void 666 setTokenTypeChannel (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_UINT32 ttype, ANTLR3_UINT32 channel) 667 { 668 if (tokenStream->channelOverrides == NULL) 669 { 670 tokenStream->channelOverrides = antlr3ListNew(10); 671 } 672 673 /* We add one to the channel so we can distinguish NULL as being no entry in the 674 * table for a particular token type. 675 */ 676 tokenStream->channelOverrides->put(tokenStream->channelOverrides, ttype, ANTLR3_FUNC_PTR((ANTLR3_UINT32)channel + 1), NULL); 677 } 678 679 static void 680 discardTokenType (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_INT32 ttype) 681 { 682 if (tokenStream->discardSet == NULL) 683 { 684 tokenStream->discardSet = antlr3ListNew(31); 685 } 686 687 /* We add one to the channel so we can distinguish NULL as being no entry in the 688 * table for a particular token type. We could use bitsets for this I suppose too. 689 */ 690 tokenStream->discardSet->put(tokenStream->discardSet, ttype, ANTLR3_FUNC_PTR((ANTLR3_UINT32)ttype + 1), NULL); 691 } 692 693 static void 694 discardOffChannel (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_BOOLEAN discard) 695 { 696 tokenStream->discardOffChannel = discard; 697 } 698 699 static pANTLR3_VECTOR 700 getTokens (pANTLR3_COMMON_TOKEN_STREAM tokenStream) 701 { 702 if (tokenStream->p == -1) 703 { 704 fillBuffer(tokenStream); 705 } 706 707 return tokenStream->tokens; 708 } 709 710 static pANTLR3_LIST 711 getTokenRange (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_UINT32 start, ANTLR3_UINT32 stop) 712 { 713 return tokenStream->getTokensSet(tokenStream, start, stop, NULL); 714 } 715 /** Given a start and stop index, return a List of all tokens in 716 * the token type BitSet. Return null if no tokens were found. This 717 * method looks at both on and off channel tokens. 718 */ 719 static pANTLR3_LIST 720 getTokensSet (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_UINT32 start, ANTLR3_UINT32 stop, pANTLR3_BITSET types) 721 { 722 pANTLR3_LIST filteredList; 723 ANTLR3_UINT32 i; 724 ANTLR3_UINT32 n; 725 pANTLR3_COMMON_TOKEN tok; 726 727 if (tokenStream->p == -1) 728 { 729 fillBuffer(tokenStream); 730 } 731 if (stop > tokenStream->tstream->istream->size(tokenStream->tstream->istream)) 732 { 733 stop = tokenStream->tstream->istream->size(tokenStream->tstream->istream); 734 } 735 if (start > stop) 736 { 737 return NULL; 738 } 739 740 /* We have the range set, now we need to iterate through the 741 * installed tokens and create a new list with just the ones we want 742 * in it. We are just moving pointers about really. 743 */ 744 filteredList = antlr3ListNew((ANTLR3_UINT32)tokenStream->tstream->istream->size(tokenStream->tstream->istream)); 745 746 for (i = start, n = 0; i<= stop; i++) 747 { 748 tok = tokenStream->tstream->get(tokenStream->tstream, i); 749 750 if ( types == NULL 751 || types->isMember(types, tok->getType(tok) == ANTLR3_TRUE) 752 ) 753 { 754 filteredList->put(filteredList, n++, (void *)tok, NULL); 755 } 756 } 757 758 /* Did we get any then? 759 */ 760 if (filteredList->size(filteredList) == 0) 761 { 762 filteredList->free(filteredList); 763 filteredList = NULL; 764 } 765 766 return filteredList; 767 } 768 769 static pANTLR3_LIST 770 getTokensList (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_UINT32 start, ANTLR3_UINT32 stop, pANTLR3_LIST list) 771 { 772 pANTLR3_BITSET bitSet; 773 pANTLR3_LIST newlist; 774 775 bitSet = antlr3BitsetList(list->table); 776 777 newlist = tokenStream->getTokensSet(tokenStream, start, stop, bitSet); 778 779 bitSet->free(bitSet); 780 781 return newlist; 782 783 } 784 785 static pANTLR3_LIST 786 getTokensType (pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_UINT32 start, ANTLR3_UINT32 stop, ANTLR3_UINT32 type) 787 { 788 pANTLR3_BITSET bitSet; 789 pANTLR3_LIST newlist; 790 791 bitSet = antlr3BitsetOf(type, -1); 792 newlist = tokenStream->getTokensSet(tokenStream, start, stop, bitSet); 793 794 bitSet->free(bitSet); 795 796 return newlist; 797 } 798 799 static ANTLR3_UINT32 800 _LA (pANTLR3_INT_STREAM is, ANTLR3_INT32 i) 801 { 802 pANTLR3_TOKEN_STREAM ts; 803 pANTLR3_COMMON_TOKEN tok; 804 805 ts = (pANTLR3_TOKEN_STREAM) is->super; 806 807 tok = ts->_LT(ts, i); 808 809 if (tok != NULL) 810 { 811 return tok->getType(tok); 812 } 813 else 814 { 815 return ANTLR3_TOKEN_INVALID; 816 } 817 } 818 819 /// As per _LA() but for debug mode. 820 /// 821 static ANTLR3_UINT32 822 dbgLA (pANTLR3_INT_STREAM is, ANTLR3_INT32 i) 823 { 824 pANTLR3_TOKEN_STREAM ts; 825 826 ts = (pANTLR3_TOKEN_STREAM) is->super; 827 828 if (ts->initialStreamState == ANTLR3_TRUE) 829 { 830 consumeInitialHiddenTokens(is); 831 } 832 ts->debugger->LT(ts->debugger, i, tokLT(ts, i)); 833 return _LA(is, i); 834 } 835 836 static ANTLR3_MARKER 837 mark (pANTLR3_INT_STREAM is) 838 { 839 is->lastMarker = is->index(is); 840 return is->lastMarker; 841 } 842 843 /// As per mark() but with a call to tell the debugger we are doing this 844 /// 845 static ANTLR3_MARKER 846 dbgMark (pANTLR3_INT_STREAM is) 847 { 848 pANTLR3_TOKEN_STREAM ts; 849 850 ts = (pANTLR3_TOKEN_STREAM) is->super; 851 852 is->lastMarker = is->index(is); 853 ts->debugger->mark(ts->debugger, is->lastMarker); 854 855 return is->lastMarker; 856 } 857 858 static void 859 release (pANTLR3_INT_STREAM is, ANTLR3_MARKER mark) 860 { 861 return; 862 } 863 864 static ANTLR3_UINT32 865 size (pANTLR3_INT_STREAM is) 866 { 867 pANTLR3_COMMON_TOKEN_STREAM cts; 868 pANTLR3_TOKEN_STREAM ts; 869 870 if (is->cachedSize > 0) 871 { 872 return is->cachedSize; 873 } 874 ts = (pANTLR3_TOKEN_STREAM) is->super; 875 cts = (pANTLR3_COMMON_TOKEN_STREAM) ts->super; 876 877 is->cachedSize = cts->tokens->count; 878 return is->cachedSize; 879 } 880 881 static ANTLR3_MARKER 882 tindex (pANTLR3_INT_STREAM is) 883 { 884 pANTLR3_COMMON_TOKEN_STREAM cts; 885 pANTLR3_TOKEN_STREAM ts; 886 887 ts = (pANTLR3_TOKEN_STREAM) is->super; 888 cts = (pANTLR3_COMMON_TOKEN_STREAM) ts->super; 889 890 return cts->p; 891 } 892 893 static void 894 dbgRewindLast (pANTLR3_INT_STREAM is) 895 { 896 pANTLR3_TOKEN_STREAM ts; 897 898 ts = (pANTLR3_TOKEN_STREAM) is->super; 899 900 ts->debugger->rewindLast(ts->debugger); 901 902 is->rewind(is, is->lastMarker); 903 } 904 static void 905 rewindLast (pANTLR3_INT_STREAM is) 906 { 907 is->rewind(is, is->lastMarker); 908 } 909 static void 910 rewindStream (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker) 911 { 912 is->seek(is, (ANTLR3_UINT32)(marker)); 913 } 914 static void 915 dbgRewindStream (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker) 916 { 917 pANTLR3_TOKEN_STREAM ts; 918 919 ts = (pANTLR3_TOKEN_STREAM) is->super; 920 921 ts->debugger->rewind(ts->debugger, marker); 922 923 is->seek(is, (ANTLR3_UINT32)(marker)); 924 } 925 926 static void 927 seek (pANTLR3_INT_STREAM is, ANTLR3_MARKER index) 928 { 929 pANTLR3_COMMON_TOKEN_STREAM cts; 930 pANTLR3_TOKEN_STREAM ts; 931 932 ts = (pANTLR3_TOKEN_STREAM) is->super; 933 cts = (pANTLR3_COMMON_TOKEN_STREAM) ts->super; 934 935 cts->p = (ANTLR3_UINT32)index; 936 } 937 static void 938 dbgSeek (pANTLR3_INT_STREAM is, ANTLR3_MARKER index) 939 { 940 // TODO: Implement seek in debugger when Ter adds it to Java 941 // 942 seek(is, index); 943 } 944 ANTLR3_API void 945 fillBufferExt(pANTLR3_COMMON_TOKEN_STREAM tokenStream) 946 { 947 fillBuffer(tokenStream); 948 } 949 static void 950 fillBuffer(pANTLR3_COMMON_TOKEN_STREAM tokenStream) { 951 ANTLR3_UINT32 index; 952 pANTLR3_COMMON_TOKEN tok; 953 ANTLR3_BOOLEAN discard; 954 void * channelI; 955 956 /* Start at index 0 of course 957 */ 958 index = 0; 959 960 /* Pick out the next token from the token source 961 * Remember we just get a pointer (reference if you like) here 962 * and so if we store it anywhere, we don't set any pointers to auto free it. 963 */ 964 tok = tokenStream->tstream->tokenSource->nextToken(tokenStream->tstream->tokenSource); 965 966 while (tok != NULL && tok->type != ANTLR3_TOKEN_EOF) 967 { 968 discard = ANTLR3_FALSE; /* Assume we are not discarding */ 969 970 /* I employ a bit of a trick, or perhaps hack here. Rather than 971 * store a pointer to a structure in the override map and discard set 972 * we store the value + 1 cast to a void *. Hence on systems where NULL = (void *)0 973 * we can distinguish "not being there" from "being channel or type 0" 974 */ 975 976 if (tokenStream->discardSet != NULL 977 && tokenStream->discardSet->get(tokenStream->discardSet, tok->getType(tok)) != NULL) 978 { 979 discard = ANTLR3_TRUE; 980 } 981 else if ( tokenStream->discardOffChannel == ANTLR3_TRUE 982 && tok->getChannel(tok) != tokenStream->channel 983 ) 984 { 985 discard = ANTLR3_TRUE; 986 } 987 else if (tokenStream->channelOverrides != NULL) 988 { 989 /* See if this type is in the override map 990 */ 991 channelI = tokenStream->channelOverrides->get(tokenStream->channelOverrides, tok->getType(tok) + 1); 992 993 if (channelI != NULL) 994 { 995 /* Override found 996 */ 997 tok->setChannel(tok, ANTLR3_UINT32_CAST(channelI) - 1); 998 } 999 } 1000 1001 /* If not discarding it, add it to the list at the current index 1002 */ 1003 if (discard == ANTLR3_FALSE) 1004 { 1005 /* Add it, indicating that we will delete it and the table should not 1006 */ 1007 tok->setTokenIndex(tok, index); 1008 tokenStream->p++; 1009 tokenStream->tokens->add(tokenStream->tokens, (void *) tok, NULL); 1010 index++; 1011 } 1012 1013 tok = tokenStream->tstream->tokenSource->nextToken(tokenStream->tstream->tokenSource); 1014 } 1015 1016 /* Cache the size so we don't keep doing indirect method calls. We do this as 1017 * early as possible so that anything after this may utilize the cached value. 1018 */ 1019 tokenStream->tstream->istream->cachedSize = tokenStream->tokens->count; 1020 1021 /* Set the consume pointer to the first token that is on our channel 1022 */ 1023 tokenStream->p = 0; 1024 tokenStream->p = skipOffTokenChannels(tokenStream, tokenStream->p); 1025 1026 } 1027 1028 /// Given a starting index, return the index of the first on-channel 1029 /// token. 1030 /// 1031 static ANTLR3_UINT32 1032 skipOffTokenChannels(pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_INT32 i) { 1033 ANTLR3_INT32 n; 1034 pANTLR3_COMMON_TOKEN tok; 1035 1036 n = tokenStream->tstream->istream->cachedSize; 1037 1038 while (i < n) 1039 { 1040 tok = (pANTLR3_COMMON_TOKEN)tokenStream->tokens->elements[i].element; 1041 1042 if (tok->channel!= tokenStream->channel) 1043 { 1044 i++; 1045 } 1046 else 1047 { 1048 return i; 1049 } 1050 } 1051 return i; 1052 } 1053 1054 static ANTLR3_UINT32 1055 skipOffTokenChannelsReverse(pANTLR3_COMMON_TOKEN_STREAM tokenStream, ANTLR3_INT32 x) 1056 { 1057 pANTLR3_COMMON_TOKEN tok; 1058 1059 while (x >= 0) 1060 { 1061 tok = (pANTLR3_COMMON_TOKEN)tokenStream->tokens->elements[x].element; 1062 1063 if ((tok->channel != tokenStream->channel)) 1064 { 1065 x--; 1066 } 1067 else 1068 { 1069 return x; 1070 } 1071 } 1072 return x; 1073 } 1074 1075 /// Return a string that represents the name assoicated with the input source 1076 /// 1077 /// /param[in] is The ANTLR3_INT_STREAM interface that is representing this token stream. 1078 /// 1079 /// /returns 1080 /// /implements ANTLR3_INT_STREAM_struct::getSourceName() 1081 /// 1082 static pANTLR3_STRING 1083 getSourceName (pANTLR3_INT_STREAM is) 1084 { 1085 // Slightly convoluted as we must trace back to the lexer's input source 1086 // via the token source. The streamName that is here is not initialized 1087 // because this is a token stream, not a file or string stream, which are the 1088 // only things that have a context for a source name. 1089 // 1090 return ((pANTLR3_TOKEN_STREAM)(is->super))->tokenSource->fileName; 1091 } 1092