001: /*
002: [The "BSD licence"]
003: Copyright (c) 2005-2006 Terence Parr
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009: 1. Redistributions of source code must retain the above copyright
010: notice, this list of conditions and the following disclaimer.
011: 2. Redistributions in binary form must reproduce the above copyright
012: notice, this list of conditions and the following disclaimer in the
013: documentation and/or other materials provided with the distribution.
014: 3. The name of the author may not be used to endorse or promote products
015: derived from this software without specific prior written permission.
016:
017: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
018: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
019: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
020: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
021: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
022: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
023: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
024: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
026: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: */
028: package org.antlr.runtime.debug;
029:
030: import org.antlr.runtime.*;
031:
032: public class DebugTokenStream implements TokenStream {
033: protected DebugEventListener dbg;
034: public TokenStream input;
035: protected boolean initialStreamState = true;
036:
037: /** Track the last mark() call result value for use in rewind(). */
038: protected int lastMarker;
039:
040: public DebugTokenStream(TokenStream input, DebugEventListener dbg) {
041: this .input = input;
042: setDebugListener(dbg);
043: // force TokenStream to get at least first valid token
044: // so we know if there are any hidden tokens first in the stream
045: input.LT(1);
046: }
047:
048: public void setDebugListener(DebugEventListener dbg) {
049: this .dbg = dbg;
050: }
051:
052: public void consume() {
053: if (initialStreamState) {
054: consumeInitialHiddenTokens();
055: }
056: int a = input.index();
057: Token t = input.LT(1);
058: input.consume();
059: int b = input.index();
060: dbg.consumeToken(t);
061: if (b > a + 1) {
062: // then we consumed more than one token; must be off channel tokens
063: for (int i = a + 1; i < b; i++) {
064: dbg.consumeHiddenToken(input.get(i));
065: }
066: }
067: }
068:
069: /* consume all initial off-channel tokens */
070: protected void consumeInitialHiddenTokens() {
071: int firstOnChannelTokenIndex = input.index();
072: for (int i = 0; i < firstOnChannelTokenIndex; i++) {
073: dbg.consumeHiddenToken(input.get(i));
074: }
075: initialStreamState = false;
076: }
077:
078: public Token LT(int i) {
079: if (initialStreamState) {
080: consumeInitialHiddenTokens();
081: }
082: dbg.LT(i, input.LT(i));
083: return input.LT(i);
084: }
085:
086: public int LA(int i) {
087: if (initialStreamState) {
088: consumeInitialHiddenTokens();
089: }
090: dbg.LT(i, input.LT(i));
091: return input.LA(i);
092: }
093:
094: public Token get(int i) {
095: return input.get(i);
096: }
097:
098: public int mark() {
099: lastMarker = input.mark();
100: dbg.mark(lastMarker);
101: return lastMarker;
102: }
103:
104: public int index() {
105: return input.index();
106: }
107:
108: public void rewind(int marker) {
109: dbg.rewind(marker);
110: input.rewind(marker);
111: }
112:
113: public void rewind() {
114: dbg.rewind();
115: input.rewind(lastMarker);
116: }
117:
118: public void release(int marker) {
119: }
120:
121: public void seek(int index) {
122: // TODO: implement seek in dbg interface
123: // db.seek(index);
124: input.seek(index);
125: }
126:
127: public int size() {
128: return input.size();
129: }
130:
131: public TokenSource getTokenSource() {
132: return input.getTokenSource();
133: }
134:
135: public String toString() {
136: return input.toString();
137: }
138:
139: public String toString(int start, int stop) {
140: return input.toString(start, stop);
141: }
142:
143: public String toString(Token start, Token stop) {
144: return input.toString(start, stop);
145: }
146: }
|