1 namespace antlr.debug 2 { 3 using System; 4 using System.Threading; 5 using antlr; 6 7 using BitSet = antlr.collections.impl.BitSet; 8 9 public abstract class DebuggingCharScanner : CharScanner, DebuggingParser 10 { InitBlock()11 private void InitBlock() 12 { 13 eventSupport = new ScannerEventSupport(this); 14 } setDebugMode(bool mode)15 public virtual void setDebugMode(bool mode) 16 { 17 _notDebugMode = !mode; 18 } 19 20 private ScannerEventSupport eventSupport; 21 private bool _notDebugMode = false; 22 protected internal string[] ruleNames; 23 protected internal string[] semPredNames; 24 25 DebuggingCharScanner(InputBuffer cb)26 public DebuggingCharScanner(InputBuffer cb) : base(cb) 27 { 28 InitBlock(); 29 } DebuggingCharScanner(LexerSharedInputState state)30 public DebuggingCharScanner(LexerSharedInputState state) : base(state) 31 { 32 InitBlock(); 33 } addMessageListener(MessageListener l)34 public virtual void addMessageListener(MessageListener l) 35 { 36 eventSupport.addMessageListener(l); 37 } addNewLineListener(NewLineListener l)38 public virtual void addNewLineListener(NewLineListener l) 39 { 40 eventSupport.addNewLineListener(l); 41 } addParserListener(ParserListener l)42 public virtual void addParserListener(ParserListener l) 43 { 44 eventSupport.addParserListener(l); 45 } addParserMatchListener(ParserMatchListener l)46 public virtual void addParserMatchListener(ParserMatchListener l) 47 { 48 eventSupport.addParserMatchListener(l); 49 } addParserTokenListener(ParserTokenListener l)50 public virtual void addParserTokenListener(ParserTokenListener l) 51 { 52 eventSupport.addParserTokenListener(l); 53 } addSemanticPredicateListener(SemanticPredicateListener l)54 public virtual void addSemanticPredicateListener(SemanticPredicateListener l) 55 { 56 eventSupport.addSemanticPredicateListener(l); 57 } addSyntacticPredicateListener(SyntacticPredicateListener l)58 public virtual void addSyntacticPredicateListener(SyntacticPredicateListener l) 59 { 60 eventSupport.addSyntacticPredicateListener(l); 61 } addTraceListener(TraceListener l)62 public virtual void addTraceListener(TraceListener l) 63 { 64 eventSupport.addTraceListener(l); 65 } consume()66 public override void consume() 67 { 68 int la_1 = - 99; 69 try 70 { 71 la_1 = LA(1); 72 } 73 catch (CharStreamException) 74 { 75 } 76 base.consume(); 77 eventSupport.fireConsume(la_1); 78 } fireEnterRule(int num, int data)79 protected internal virtual void fireEnterRule(int num, int data) 80 { 81 if (isDebugMode()) 82 eventSupport.fireEnterRule(num, inputState.guessing, data); 83 } fireExitRule(int num, int ttype)84 protected internal virtual void fireExitRule(int num, int ttype) 85 { 86 if (isDebugMode()) 87 eventSupport.fireExitRule(num, inputState.guessing, ttype); 88 } fireSemanticPredicateEvaluated(int type, int num, bool condition)89 protected internal virtual bool fireSemanticPredicateEvaluated(int type, int num, bool condition) 90 { 91 if (isDebugMode()) 92 return eventSupport.fireSemanticPredicateEvaluated(type, num, condition, inputState.guessing); 93 else 94 return condition; 95 } fireSyntacticPredicateFailed()96 protected internal virtual void fireSyntacticPredicateFailed() 97 { 98 if (isDebugMode()) 99 eventSupport.fireSyntacticPredicateFailed(inputState.guessing); 100 } fireSyntacticPredicateStarted()101 protected internal virtual void fireSyntacticPredicateStarted() 102 { 103 if (isDebugMode()) 104 eventSupport.fireSyntacticPredicateStarted(inputState.guessing); 105 } fireSyntacticPredicateSucceeded()106 protected internal virtual void fireSyntacticPredicateSucceeded() 107 { 108 if (isDebugMode()) 109 eventSupport.fireSyntacticPredicateSucceeded(inputState.guessing); 110 } getRuleName(int num)111 public virtual string getRuleName(int num) 112 { 113 return ruleNames[num]; 114 } getSemPredName(int num)115 public virtual string getSemPredName(int num) 116 { 117 return semPredNames[num]; 118 } goToSleep()119 public virtual void goToSleep() 120 { 121 lock(this) 122 { 123 try 124 { 125 Monitor.Wait(this); 126 } 127 catch (System.Threading.ThreadInterruptedException) 128 { 129 } 130 } 131 } isDebugMode()132 public virtual bool isDebugMode() 133 { 134 return !_notDebugMode; 135 } LA(int i)136 public override char LA(int i) 137 { 138 char la = base.LA(i); 139 eventSupport.fireLA(i, la); 140 return la; 141 } makeToken(int t)142 protected internal override IToken makeToken(int t) 143 { 144 // do something with char buffer??? 145 // try { 146 // IToken tok = (Token)tokenObjectClass.newInstance(); 147 // tok.setType(t); 148 // // tok.setText(getText()); done in generated lexer now 149 // tok.setLine(line); 150 // return tok; 151 // } 152 // catch (InstantiationException ie) { 153 // panic("can't instantiate a Token"); 154 // } 155 // catch (IllegalAccessException iae) { 156 // panic("Token class is not accessible"); 157 // } 158 return base.makeToken(t); 159 } match(int c)160 public override void match(int c) 161 { 162 char la_1 = LA(1); 163 try 164 { 165 base.match(c); 166 eventSupport.fireMatch(Convert.ToChar(c), inputState.guessing); 167 } 168 catch (MismatchedCharException e) 169 { 170 if (inputState.guessing == 0) 171 eventSupport.fireMismatch(la_1, Convert.ToChar(c), inputState.guessing); 172 throw e; 173 } 174 } match(BitSet b)175 public override void match(BitSet b) 176 { 177 string text = this.text.ToString(); 178 char la_1 = LA(1); 179 try 180 { 181 base.match(b); 182 eventSupport.fireMatch(la_1, b, text, inputState.guessing); 183 } 184 catch (MismatchedCharException e) 185 { 186 if (inputState.guessing == 0) 187 eventSupport.fireMismatch(la_1, b, text, inputState.guessing); 188 throw e; 189 } 190 } match(string s)191 public override void match(string s) 192 { 193 System.Text.StringBuilder la_s = new System.Text.StringBuilder(""); 194 int len = s.Length; 195 // peek at the next len worth of characters 196 try 197 { 198 for (int i = 1; i <= len; i++) 199 { 200 la_s.Append(base.LA(i)); 201 } 202 } 203 catch (System.Exception) 204 { 205 } 206 207 try 208 { 209 base.match(s); 210 eventSupport.fireMatch(s, inputState.guessing); 211 } 212 catch (MismatchedCharException e) 213 { 214 if (inputState.guessing == 0) 215 eventSupport.fireMismatch(la_s.ToString(), s, inputState.guessing); 216 throw e; 217 } 218 219 } matchNot(int c)220 public override void matchNot(int c) 221 { 222 char la_1 = LA(1); 223 try 224 { 225 base.matchNot(c); 226 eventSupport.fireMatchNot(la_1, Convert.ToChar(c), inputState.guessing); 227 } 228 catch (MismatchedCharException e) 229 { 230 if (inputState.guessing == 0) 231 eventSupport.fireMismatchNot(la_1, Convert.ToChar(c), inputState.guessing); 232 throw e; 233 } 234 235 } matchRange(int c1, int c2)236 public override void matchRange(int c1, int c2) 237 { 238 char la_1 = LA(1); 239 try 240 { 241 base.matchRange(c1, c2); 242 eventSupport.fireMatch(la_1, "" + c1 + c2, inputState.guessing); 243 } 244 catch (MismatchedCharException e) 245 { 246 if (inputState.guessing == 0) 247 eventSupport.fireMismatch(la_1, "" + c1 + c2, inputState.guessing); 248 throw e; 249 } 250 251 } newline()252 public override void newline() 253 { 254 base.newline(); 255 eventSupport.fireNewLine(getLine()); 256 } removeMessageListener(MessageListener l)257 public virtual void removeMessageListener(MessageListener l) 258 { 259 eventSupport.removeMessageListener(l); 260 } removeNewLineListener(NewLineListener l)261 public virtual void removeNewLineListener(NewLineListener l) 262 { 263 eventSupport.removeNewLineListener(l); 264 } removeParserListener(ParserListener l)265 public virtual void removeParserListener(ParserListener l) 266 { 267 eventSupport.removeParserListener(l); 268 } removeParserMatchListener(ParserMatchListener l)269 public virtual void removeParserMatchListener(ParserMatchListener l) 270 { 271 eventSupport.removeParserMatchListener(l); 272 } removeParserTokenListener(ParserTokenListener l)273 public virtual void removeParserTokenListener(ParserTokenListener l) 274 { 275 eventSupport.removeParserTokenListener(l); 276 } removeSemanticPredicateListener(SemanticPredicateListener l)277 public virtual void removeSemanticPredicateListener(SemanticPredicateListener l) 278 { 279 eventSupport.removeSemanticPredicateListener(l); 280 } removeSyntacticPredicateListener(SyntacticPredicateListener l)281 public virtual void removeSyntacticPredicateListener(SyntacticPredicateListener l) 282 { 283 eventSupport.removeSyntacticPredicateListener(l); 284 } removeTraceListener(TraceListener l)285 public virtual void removeTraceListener(TraceListener l) 286 { 287 eventSupport.removeTraceListener(l); 288 } 289 /// <summary>Report exception errors caught in nextToken() 290 /// </summary> reportError(MismatchedCharException e)291 public virtual void reportError(MismatchedCharException e) 292 { 293 eventSupport.fireReportError(e); 294 base.reportError(e); 295 } 296 /// <summary>Parser error-reporting function can be overridden in subclass 297 /// </summary> reportError(string s)298 public override void reportError(string s) 299 { 300 eventSupport.fireReportError(s); 301 base.reportError(s); 302 } 303 /// <summary>Parser warning-reporting function can be overridden in subclass 304 /// </summary> reportWarning(string s)305 public override void reportWarning(string s) 306 { 307 eventSupport.fireReportWarning(s); 308 base.reportWarning(s); 309 } setupDebugging()310 public virtual void setupDebugging() 311 { 312 } 313 wakeUp()314 public virtual void wakeUp() 315 { 316 lock(this) 317 { 318 Monitor.Pulse(this); 319 } 320 } 321 } 322 }