1 package antlr.debug;
2 
3 import antlr.collections.impl.BitSet;
4 import java.io.IOException;
5 import antlr.TokenStreamException;
6 import antlr.*;
7 
8 import antlr.debug.ParserEventSupport;
9 
10 import java.lang.reflect.Constructor;
11 
12 public class LLkDebuggingParser extends LLkParser implements DebuggingParser {
13 	protected ParserEventSupport parserEventSupport = new ParserEventSupport(this);
14 
15 	private boolean _notDebugMode = false;
16 	protected String ruleNames[];
17 	protected String semPredNames[];
18 
19 
LLkDebuggingParser(int k_)20 	public LLkDebuggingParser(int k_) {
21 		super(k_);
22 	}
LLkDebuggingParser(ParserSharedInputState state, int k_)23 	public LLkDebuggingParser(ParserSharedInputState state, int k_) {
24 		super(state, k_);
25 	}
LLkDebuggingParser(TokenBuffer tokenBuf, int k_)26 	public LLkDebuggingParser(TokenBuffer tokenBuf, int k_) {
27 		super(tokenBuf, k_);
28 	}
LLkDebuggingParser(TokenStream lexer, int k_)29 	public LLkDebuggingParser(TokenStream lexer, int k_) {
30 		super(lexer, k_);
31 	}
addMessageListener(MessageListener l)32 	public void addMessageListener(MessageListener l) {
33 		parserEventSupport.addMessageListener(l);
34 	}
addParserListener(ParserListener l)35 	public void addParserListener(ParserListener l) {
36 		parserEventSupport.addParserListener(l);
37 	}
addParserMatchListener(ParserMatchListener l)38 	public void addParserMatchListener(ParserMatchListener l) {
39 		parserEventSupport.addParserMatchListener(l);
40 	}
addParserTokenListener(ParserTokenListener l)41 	public void addParserTokenListener(ParserTokenListener l) {
42 		parserEventSupport.addParserTokenListener(l);
43 	}
addSemanticPredicateListener(SemanticPredicateListener l)44 	public void addSemanticPredicateListener(SemanticPredicateListener l) {
45 		parserEventSupport.addSemanticPredicateListener(l);
46 	}
addSyntacticPredicateListener(SyntacticPredicateListener l)47 	public void addSyntacticPredicateListener(SyntacticPredicateListener l) {
48 		parserEventSupport.addSyntacticPredicateListener(l);
49 	}
addTraceListener(TraceListener l)50 	public void addTraceListener(TraceListener l) {
51 		parserEventSupport.addTraceListener(l);
52 	}
53 	/**Get another token object from the token stream */
consume()54 	public void consume() throws TokenStreamException {
55 		int la_1 = -99;
56 		la_1 = LA(1);
57 		super.consume();
58 		parserEventSupport.fireConsume(la_1);
59 	}
fireEnterRule(int num,int data)60 	protected void fireEnterRule(int num,int data) {
61 		if (isDebugMode())
62 			parserEventSupport.fireEnterRule(num,inputState.guessing,data);
63 	}
fireExitRule(int num,int data)64 	protected void fireExitRule(int num,int data) {
65 		if (isDebugMode())
66 			parserEventSupport.fireExitRule(num,inputState.guessing,data);
67 	}
fireSemanticPredicateEvaluated(int type, int num, boolean condition)68 	protected boolean fireSemanticPredicateEvaluated(int type, int num, boolean condition) {
69 		if (isDebugMode())
70 			return parserEventSupport.fireSemanticPredicateEvaluated(type,num,condition,inputState.guessing);
71 		else
72 			return condition;
73 	}
fireSyntacticPredicateFailed()74 	protected void fireSyntacticPredicateFailed() {
75 		if (isDebugMode())
76 			parserEventSupport.fireSyntacticPredicateFailed(inputState.guessing);
77 	}
fireSyntacticPredicateStarted()78 	protected void fireSyntacticPredicateStarted() {
79 		if (isDebugMode())
80 			parserEventSupport.fireSyntacticPredicateStarted(inputState.guessing);
81 	}
fireSyntacticPredicateSucceeded()82 	protected void fireSyntacticPredicateSucceeded() {
83 		if (isDebugMode())
84 			parserEventSupport.fireSyntacticPredicateSucceeded(inputState.guessing);
85 	}
getRuleName(int num)86 	public String getRuleName(int num) {
87 		return ruleNames[num];
88 	}
getSemPredName(int num)89 	public String getSemPredName(int num) {
90 		return semPredNames[num];
91 	}
goToSleep()92 	public synchronized void goToSleep() {
93 		try {wait();}
94 		catch (InterruptedException e) {	}
95 	}
isDebugMode()96 	public boolean isDebugMode() {
97 		return !_notDebugMode;
98 	}
isGuessing()99 	public boolean isGuessing() {
100 		return inputState.guessing > 0;
101 	}
102 	/** Return the token type of the ith token of lookahead where i=1
103 	 * is the current token being examined by the parser (i.e., it
104 	 * has not been matched yet).
105 	 */
LA(int i)106 	public int LA(int i) throws TokenStreamException {
107 		int la = super.LA(i);
108 		parserEventSupport.fireLA(i, la);
109 		return la;
110 	}
111 	/**Make sure current lookahead symbol matches token type <tt>t</tt>.
112 	 * Throw an exception upon mismatch, which is catch by either the
113 	 * error handler or by the syntactic predicate.
114 	 */
match(int t)115 	public void match(int t) throws MismatchedTokenException, TokenStreamException {
116 		String text = LT(1).getText();
117 		int la_1 = LA(1);
118 		try {
119 			super.match(t);
120 			parserEventSupport.fireMatch(t, text, inputState.guessing);
121 		}
122 		catch (MismatchedTokenException e) {
123 			if (inputState.guessing == 0)
124 				parserEventSupport.fireMismatch(la_1, t, text, inputState.guessing);
125 			throw e;
126 		}
127 	}
128 	/**Make sure current lookahead symbol matches the given set
129 	 * Throw an exception upon mismatch, which is catch by either the
130 	 * error handler or by the syntactic predicate.
131 	 */
match(BitSet b)132 	public void match(BitSet b) throws MismatchedTokenException, TokenStreamException {
133 		String text = LT(1).getText();
134 		int la_1 = LA(1);
135 		try {
136 			super.match(b);
137 			parserEventSupport.fireMatch(la_1,b, text, inputState.guessing);
138 		}
139 		catch (MismatchedTokenException e) {
140 			if (inputState.guessing == 0)
141 				parserEventSupport.fireMismatch(la_1, b, text, inputState.guessing);
142 			throw e;
143 		}
144 	}
matchNot(int t)145 	public void matchNot(int t) throws MismatchedTokenException, TokenStreamException {
146 		String text = LT(1).getText();
147 		int la_1 = LA(1);
148 		try {
149 			super.matchNot(t);
150 			parserEventSupport.fireMatchNot(la_1, t, text, inputState.guessing);
151 		}
152 		catch (MismatchedTokenException e) {
153 			if (inputState.guessing == 0)
154 				parserEventSupport.fireMismatchNot(la_1, t, text, inputState.guessing);
155 			throw e;
156 		}
157 	}
removeMessageListener(MessageListener l)158 	public void removeMessageListener(MessageListener l) {
159 		parserEventSupport.removeMessageListener(l);
160 	}
removeParserListener(ParserListener l)161 	public void removeParserListener(ParserListener l) {
162 		parserEventSupport.removeParserListener(l);
163 	}
removeParserMatchListener(ParserMatchListener l)164 	public void removeParserMatchListener(ParserMatchListener l) {
165 		parserEventSupport.removeParserMatchListener(l);
166 	}
removeParserTokenListener(ParserTokenListener l)167 	public void removeParserTokenListener(ParserTokenListener l) {
168 		parserEventSupport.removeParserTokenListener(l);
169 	}
removeSemanticPredicateListener(SemanticPredicateListener l)170 	public void removeSemanticPredicateListener(SemanticPredicateListener l) {
171 		parserEventSupport.removeSemanticPredicateListener(l);
172 	}
removeSyntacticPredicateListener(SyntacticPredicateListener l)173 	public void removeSyntacticPredicateListener(SyntacticPredicateListener l) {
174 		parserEventSupport.removeSyntacticPredicateListener(l);
175 	}
removeTraceListener(TraceListener l)176 	public void removeTraceListener(TraceListener l) {
177 		parserEventSupport.removeTraceListener(l);
178 	}
179 	/** Parser error-reporting function can be overridden in subclass */
reportError(RecognitionException ex)180 	public void reportError(RecognitionException ex) {
181 		parserEventSupport.fireReportError(ex);
182 		super.reportError(ex);
183 	}
184 	/** Parser error-reporting function can be overridden in subclass */
reportError(String s)185 	public void reportError(String s) {
186 		parserEventSupport.fireReportError(s);
187 		super.reportError(s);
188 	}
189 	/** Parser warning-reporting function can be overridden in subclass */
reportWarning(String s)190 	public void reportWarning(String s) {
191 		parserEventSupport.fireReportWarning(s);
192 		super.reportWarning(s);
193 	}
setDebugMode(boolean value)194 	public void setDebugMode(boolean value) {
195 		_notDebugMode = !value;
196 	}
setupDebugging(TokenBuffer tokenBuf)197 	public void setupDebugging(TokenBuffer tokenBuf) {
198 		setupDebugging(null, tokenBuf);
199 	}
setupDebugging(TokenStream lexer)200 	public void setupDebugging(TokenStream lexer) {
201 		setupDebugging(lexer, null);
202 	}
203 	/** User can override to do their own debugging */
setupDebugging(TokenStream lexer, TokenBuffer tokenBuf)204 	protected void setupDebugging(TokenStream lexer, TokenBuffer tokenBuf) {
205 		setDebugMode(true);
206 		// default parser debug setup is ParseView
207 		try {
208 			try {
209 				Utils.loadClass("javax.swing.JButton");
210 			}
211 			catch (ClassNotFoundException e) {
212 				System.err.println("Swing is required to use ParseView, but is not present in your CLASSPATH");
213 				System.exit(1);
214 			}
215 			Class c = Utils.loadClass("antlr.parseview.ParseView");
216 			Constructor constructor = c.getConstructor(new Class[] {LLkDebuggingParser.class, TokenStream.class, TokenBuffer.class});
217 			constructor.newInstance(new Object[] {this, lexer, tokenBuf});
218 		}
219 		catch(Exception e) {
220 			System.err.println("Error initializing ParseView: "+e);
221 			System.err.println("Please report this to Scott Stanchfield, thetick@magelang.com");
222 			System.exit(1);
223 		}
224 	}
wakeUp()225 	public synchronized void wakeUp() {
226 		notify();
227 	}
228 }
229