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: import java.io.IOException;
033:
034: public class DebugParser extends Parser {
035: /** Who to notify when events in the parser occur. */
036: protected DebugEventListener dbg = null;
037:
038: /** Used to differentiate between fixed lookahead and cyclic DFA decisions
039: * while profiling.
040: */
041: public boolean isCyclicDecision = false;
042:
043: /** Create a normal parser except wrap the token stream in a debug
044: * proxy that fires consume events.
045: */
046: public DebugParser(TokenStream input, DebugEventListener dbg) {
047: super (new DebugTokenStream(input, dbg));
048: setDebugListener(dbg);
049: }
050:
051: public DebugParser(TokenStream input) {
052: this (input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT);
053: }
054:
055: public DebugParser(TokenStream input, int port) {
056: super (new DebugTokenStream(input, null));
057: }
058:
059: /** Provide a new debug event listener for this parser. Notify the
060: * input stream too that it should send events to this listener.
061: */
062: public void setDebugListener(DebugEventListener dbg) {
063: if (input instanceof DebugTokenStream) {
064: ((DebugTokenStream) input).setDebugListener(dbg);
065: }
066: this .dbg = dbg;
067: }
068:
069: public DebugEventListener getDebugListener() {
070: return dbg;
071: }
072:
073: public void reportError(IOException e) {
074: System.err.println(e);
075: e.printStackTrace(System.err);
076: }
077:
078: public void beginResync() {
079: dbg.beginResync();
080: }
081:
082: public void endResync() {
083: dbg.endResync();
084: }
085:
086: public void beginBacktrack(int level) {
087: dbg.beginBacktrack(level);
088: }
089:
090: public void endBacktrack(int level, boolean successful) {
091: dbg.endBacktrack(level, successful);
092: }
093:
094: public void recoverFromMismatchedToken(IntStream input,
095: RecognitionException mte, int ttype, BitSet follow)
096: throws RecognitionException {
097: System.err.println("recoverFromMismatchedToken");
098: dbg.recognitionException(mte);
099: super .recoverFromMismatchedToken(input, mte, ttype, follow);
100: }
101:
102: public void recoverFromMismatchedSet(IntStream input,
103: RecognitionException mte, BitSet follow)
104: throws RecognitionException {
105: dbg.recognitionException(mte);
106: super.recoverFromMismatchedSet(input, mte, follow);
107: }
108: }
|