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