1 namespace antlr.debug 2 { 3 using System; 4 using System.Threading; 5 using antlr.collections.impl; 6 7 public class LLkDebuggingParser : LLkParser, DebuggingParser 8 { InitBlock()9 private void InitBlock() 10 { 11 parserEventSupport = new ParserEventSupport(this); 12 } setDebugMode(bool mode)13 public override void setDebugMode(bool mode) 14 { 15 _notDebugMode = !mode; 16 } 17 protected internal ParserEventSupport parserEventSupport; 18 19 private bool _notDebugMode = false; 20 protected internal string[] ruleNames; 21 protected internal string[] semPredNames; 22 23 LLkDebuggingParser(int k_)24 public LLkDebuggingParser(int k_):base(k_) 25 { 26 InitBlock(); 27 } LLkDebuggingParser(ParserSharedInputState state, int k_)28 public LLkDebuggingParser(ParserSharedInputState state, int k_):base(state, k_) 29 { 30 InitBlock(); 31 } LLkDebuggingParser(TokenBuffer tokenBuf, int k_)32 public LLkDebuggingParser(TokenBuffer tokenBuf, int k_):base(tokenBuf, k_) 33 { 34 InitBlock(); 35 } LLkDebuggingParser(TokenStream lexer, int k_)36 public LLkDebuggingParser(TokenStream lexer, int k_):base(lexer, k_) 37 { 38 InitBlock(); 39 } addMessageListener(MessageListener l)40 public override void addMessageListener(MessageListener l) 41 { 42 parserEventSupport.addMessageListener(l); 43 } addParserListener(ParserListener l)44 public override void addParserListener(ParserListener l) 45 { 46 parserEventSupport.addParserListener(l); 47 } addParserMatchListener(ParserMatchListener l)48 public override void addParserMatchListener(ParserMatchListener l) 49 { 50 parserEventSupport.addParserMatchListener(l); 51 } addParserTokenListener(ParserTokenListener l)52 public override void addParserTokenListener(ParserTokenListener l) 53 { 54 parserEventSupport.addParserTokenListener(l); 55 } addSemanticPredicateListener(SemanticPredicateListener l)56 public override void addSemanticPredicateListener(SemanticPredicateListener l) 57 { 58 parserEventSupport.addSemanticPredicateListener(l); 59 } addSyntacticPredicateListener(SyntacticPredicateListener l)60 public override void addSyntacticPredicateListener(SyntacticPredicateListener l) 61 { 62 parserEventSupport.addSyntacticPredicateListener(l); 63 } addTraceListener(TraceListener l)64 public override void addTraceListener(TraceListener l) 65 { 66 parserEventSupport.addTraceListener(l); 67 } 68 /// <summary>Get another token object from the token stream 69 /// </summary> consume()70 public override void consume() 71 { 72 int la_1 = - 99; 73 la_1 = LA(1); 74 base.consume(); 75 parserEventSupport.fireConsume(la_1); 76 } fireEnterRule(int num, int data)77 protected internal virtual void fireEnterRule(int num, int data) 78 { 79 if (isDebugMode()) 80 parserEventSupport.fireEnterRule(num, inputState.guessing, data); 81 } fireExitRule(int num, int data)82 protected internal virtual void fireExitRule(int num, int data) 83 { 84 if (isDebugMode()) 85 parserEventSupport.fireExitRule(num, inputState.guessing, data); 86 } fireSemanticPredicateEvaluated(int type, int num, bool condition)87 protected internal virtual bool fireSemanticPredicateEvaluated(int type, int num, bool condition) 88 { 89 if (isDebugMode()) 90 return parserEventSupport.fireSemanticPredicateEvaluated(type, num, condition, inputState.guessing); 91 else 92 return condition; 93 } fireSyntacticPredicateFailed()94 protected internal virtual void fireSyntacticPredicateFailed() 95 { 96 if (isDebugMode()) 97 parserEventSupport.fireSyntacticPredicateFailed(inputState.guessing); 98 } fireSyntacticPredicateStarted()99 protected internal virtual void fireSyntacticPredicateStarted() 100 { 101 if (isDebugMode()) 102 parserEventSupport.fireSyntacticPredicateStarted(inputState.guessing); 103 } fireSyntacticPredicateSucceeded()104 protected internal virtual void fireSyntacticPredicateSucceeded() 105 { 106 if (isDebugMode()) 107 parserEventSupport.fireSyntacticPredicateSucceeded(inputState.guessing); 108 } getRuleName(int num)109 public virtual string getRuleName(int num) 110 { 111 return ruleNames[num]; 112 } getSemPredName(int num)113 public virtual string getSemPredName(int num) 114 { 115 return semPredNames[num]; 116 } 117 goToSleep()118 public virtual void goToSleep() 119 { 120 lock(this) 121 { 122 try 123 { 124 Monitor.Wait(this); 125 } 126 catch (System.Threading.ThreadInterruptedException) 127 { 128 } 129 } 130 } isDebugMode()131 public override bool isDebugMode() 132 { 133 return !_notDebugMode; 134 } isGuessing()135 public virtual bool isGuessing() 136 { 137 return inputState.guessing > 0; 138 } 139 /// <summary>Return the token type of the ith token of lookahead where i=1 140 /// is the current token being examined by the parser (i.e., it 141 /// has not been matched yet). 142 /// </summary> LA(int i)143 public override int LA(int i) 144 { 145 int la = base.LA(i); 146 parserEventSupport.fireLA(i, la); 147 return la; 148 } 149 /// <summary>Make sure current lookahead symbol matches token type <tt>t</tt>. 150 /// Throw an exception upon mismatch, which is catch by either the 151 /// error handler or by the syntactic predicate. 152 /// </summary> match(int t)153 public override void match(int t) 154 { 155 string text = LT(1).getText(); 156 int la_1 = LA(1); 157 try 158 { 159 base.match(t); 160 parserEventSupport.fireMatch(t, text, inputState.guessing); 161 } 162 catch (MismatchedTokenException e) 163 { 164 if (inputState.guessing == 0) 165 parserEventSupport.fireMismatch(la_1, t, text, inputState.guessing); 166 throw e; 167 } 168 } 169 /// <summary>Make sure current lookahead symbol matches the given set 170 /// Throw an exception upon mismatch, which is catch by either the 171 /// error handler or by the syntactic predicate. 172 /// </summary> match(BitSet b)173 public override void match(BitSet b) 174 { 175 string text = LT(1).getText(); 176 int la_1 = LA(1); 177 try 178 { 179 base.match(b); 180 parserEventSupport.fireMatch(la_1, b, text, inputState.guessing); 181 } 182 catch (MismatchedTokenException e) 183 { 184 if (inputState.guessing == 0) 185 parserEventSupport.fireMismatch(la_1, b, text, inputState.guessing); 186 throw e; 187 } 188 } matchNot(int t)189 public override void matchNot(int t) 190 { 191 string text = LT(1).getText(); 192 int la_1 = LA(1); 193 try 194 { 195 base.matchNot(t); 196 parserEventSupport.fireMatchNot(la_1, t, text, inputState.guessing); 197 } 198 catch (MismatchedTokenException e) 199 { 200 if (inputState.guessing == 0) 201 parserEventSupport.fireMismatchNot(la_1, t, text, inputState.guessing); 202 throw e; 203 } 204 } removeMessageListener(MessageListener l)205 public override void removeMessageListener(MessageListener l) 206 { 207 parserEventSupport.removeMessageListener(l); 208 } removeParserListener(ParserListener l)209 public override void removeParserListener(ParserListener l) 210 { 211 parserEventSupport.removeParserListener(l); 212 } removeParserMatchListener(ParserMatchListener l)213 public override void removeParserMatchListener(ParserMatchListener l) 214 { 215 parserEventSupport.removeParserMatchListener(l); 216 } removeParserTokenListener(ParserTokenListener l)217 public override void removeParserTokenListener(ParserTokenListener l) 218 { 219 parserEventSupport.removeParserTokenListener(l); 220 } removeSemanticPredicateListener(SemanticPredicateListener l)221 public override void removeSemanticPredicateListener(SemanticPredicateListener l) 222 { 223 parserEventSupport.removeSemanticPredicateListener(l); 224 } removeSyntacticPredicateListener(SyntacticPredicateListener l)225 public override void removeSyntacticPredicateListener(SyntacticPredicateListener l) 226 { 227 parserEventSupport.removeSyntacticPredicateListener(l); 228 } removeTraceListener(TraceListener l)229 public override void removeTraceListener(TraceListener l) 230 { 231 parserEventSupport.removeTraceListener(l); 232 } 233 /// <summary>Parser error-reporting function can be overridden in subclass 234 /// </summary> reportError(RecognitionException ex)235 public override void reportError(RecognitionException ex) 236 { 237 parserEventSupport.fireReportError(ex); 238 base.reportError(ex); 239 } 240 /// <summary>Parser error-reporting function can be overridden in subclass 241 /// </summary> reportError(string s)242 public override void reportError(string s) 243 { 244 parserEventSupport.fireReportError(s); 245 base.reportError(s); 246 } 247 /// <summary>Parser warning-reporting function can be overridden in subclass 248 /// </summary> reportWarning(string s)249 public override void reportWarning(string s) 250 { 251 parserEventSupport.fireReportWarning(s); 252 base.reportWarning(s); 253 } setupDebugging(TokenBuffer tokenBuf)254 public virtual void setupDebugging(TokenBuffer tokenBuf) 255 { 256 setupDebugging(null, tokenBuf); 257 } setupDebugging(TokenStream lexer)258 public virtual void setupDebugging(TokenStream lexer) 259 { 260 setupDebugging(lexer, null); 261 } 262 /// <summary>User can override to do their own debugging 263 /// </summary> setupDebugging(TokenStream lexer, TokenBuffer tokenBuf)264 protected internal virtual void setupDebugging(TokenStream lexer, TokenBuffer tokenBuf) 265 { 266 setDebugMode(true); 267 // default parser debug setup is ParseView 268 try 269 { 270 // try 271 // { 272 // System.Type.GetType("javax.swing.JButton"); 273 // } 274 // catch (System.Exception) 275 // { 276 // System.Console.Error.WriteLine("Swing is required to use ParseView, but is not present in your CLASSPATH"); 277 // System.Environment.Exit(1); 278 // } 279 System.Type c = System.Type.GetType("antlr.parseview.ParseView"); 280 System.Reflection.ConstructorInfo constructor = c.GetConstructor(new System.Type[]{typeof(LLkDebuggingParser), typeof(TokenStream), typeof(TokenBuffer)}); 281 constructor.Invoke(new object[]{this, lexer, tokenBuf}); 282 } 283 catch (System.Exception e) 284 { 285 System.Console.Error.WriteLine("Error initializing ParseView: " + e); 286 System.Console.Error.WriteLine("Please report this to Scott Stanchfield, thetick@magelang.com"); 287 System.Environment.Exit(1); 288 } 289 } 290 wakeUp()291 public virtual void wakeUp() 292 { 293 lock(this) 294 { 295 Monitor.Pulse(this); 296 } 297 } 298 } 299 }