1/* ANTLR Translator Generator 2 * Project led by Terence Parr at http://www.jGuru.com 3 * Software rights: http://www.antlr.org/license.html 4 * 5 * $Id: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/src/TokenBuffer.cpp#2 $ 6 */ 7 8#include "antlr/TokenBuffer.hpp" 9 10#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 11namespace antlr { 12#endif 13 14/**A Stream of Token objects fed to the parser from a TokenStream that can 15 * be rewound via mark()/rewind() methods. 16 * <p> 17 * A dynamic array is used to buffer up all the input tokens. Normally, 18 * "k" tokens are stored in the buffer. More tokens may be stored during 19 * guess mode (testing syntactic predicate), or when LT(i>k) is referenced. 20 * Consumption of tokens is deferred. In other words, reading the next 21 * token is not done by conume(), but deferred until needed by LA or LT. 22 * <p> 23 * 24 * @see antlr.Token 25 * @see antlr.TokenStream 26 * @see antlr.TokenQueue 27 */ 28 29/** Create a token buffer */ 30TokenBuffer::TokenBuffer( TokenStream& inp ) 31: input(inp) 32, nMarkers(0) 33, markerOffset(0) 34, numToConsume(0) 35{ 36} 37 38TokenBuffer::~TokenBuffer( void ) 39{ 40} 41 42/** Ensure that the token buffer is sufficiently full */ 43void TokenBuffer::fill(unsigned int amount) 44{ 45 syncConsume(); 46 // Fill the buffer sufficiently to hold needed tokens 47 while (queue.entries() < (amount + markerOffset)) 48 { 49 // Append the next token 50 queue.append(input.nextToken()); 51 } 52} 53 54/** Get a lookahead token value */ 55int TokenBuffer::LA(unsigned int i) 56{ 57 fill(i); 58 return queue.elementAt(markerOffset+i-1)->getType(); 59} 60 61/** Get a lookahead token */ 62RefToken TokenBuffer::LT(unsigned int i) 63{ 64 fill(i); 65 return queue.elementAt(markerOffset+i-1); 66} 67 68/** Return an integer marker that can be used to rewind the buffer to 69 * its current state. 70 */ 71unsigned int TokenBuffer::mark() 72{ 73 syncConsume(); 74 nMarkers++; 75 return markerOffset; 76} 77 78/**Rewind the token buffer to a marker. 79 * @param mark Marker returned previously from mark() 80 */ 81void TokenBuffer::rewind(unsigned int mark) 82{ 83 syncConsume(); 84 markerOffset=mark; 85 nMarkers--; 86} 87 88/// Get number of non-consumed tokens 89unsigned int TokenBuffer::entries() const 90{ 91 return (unsigned int)queue.entries() - markerOffset; 92} 93 94#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 95 } 96#endif 97