LLkDebuggingParser.java
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:8k
源码类别:

编译器/解释器

开发平台:

Others

  1. package antlr.debug;
  2. import antlr.ParserSharedInputState;
  3. import antlr.TokenStreamException;
  4. import antlr.LLkParser;
  5. import antlr.TokenBuffer;
  6. import antlr.TokenStream;
  7. import antlr.MismatchedTokenException;
  8. import antlr.RecognitionException;
  9. import antlr.collections.impl.BitSet;
  10. import java.io.IOException;
  11. import antlr.TokenStreamException;
  12. import antlr.debug.ParserEventSupport;
  13. import java.lang.reflect.Constructor;
  14. public class LLkDebuggingParser extends LLkParser implements DebuggingParser {
  15. protected ParserEventSupport parserEventSupport = new ParserEventSupport(this);
  16. private boolean _notDebugMode = false;
  17. protected String ruleNames[];
  18. protected String semPredNames[];
  19. public LLkDebuggingParser(int k_) {
  20. super(k_);
  21. }
  22. public LLkDebuggingParser(ParserSharedInputState state, int k_) {
  23. super(state, k_);
  24. }
  25. public LLkDebuggingParser(TokenBuffer tokenBuf, int k_) {
  26. super(tokenBuf, k_);
  27. }
  28. public LLkDebuggingParser(TokenStream lexer, int k_) {
  29. super(lexer, k_);
  30. }
  31. public void addMessageListener(MessageListener l) {
  32. parserEventSupport.addMessageListener(l);
  33. }
  34. public void addParserListener(ParserListener l) {
  35. parserEventSupport.addParserListener(l);
  36. }
  37. public void addParserMatchListener(ParserMatchListener l) {
  38. parserEventSupport.addParserMatchListener(l);
  39. }
  40. public void addParserTokenListener(ParserTokenListener l) {
  41. parserEventSupport.addParserTokenListener(l);
  42. }
  43. public void addSemanticPredicateListener(SemanticPredicateListener l) {
  44. parserEventSupport.addSemanticPredicateListener(l);
  45. }
  46. public void addSyntacticPredicateListener(SyntacticPredicateListener l) {
  47. parserEventSupport.addSyntacticPredicateListener(l);
  48. }
  49. public void addTraceListener(TraceListener l) {
  50. parserEventSupport.addTraceListener(l);
  51. }
  52. /**Get another token object from the token stream */
  53. public void consume() {
  54. int la_1 = -99;
  55. try {la_1 = LA(1);}
  56. catch (TokenStreamException ignoreAnException) {}
  57. super.consume();
  58. parserEventSupport.fireConsume(la_1);
  59. }
  60. protected void fireEnterRule(int num,int data) {
  61. if (isDebugMode())
  62. parserEventSupport.fireEnterRule(num,inputState.guessing,data);
  63. }
  64. protected void fireExitRule(int num,int data) {
  65. if (isDebugMode())
  66. parserEventSupport.fireExitRule(num,inputState.guessing,data);
  67. }
  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. }
  74. protected void fireSyntacticPredicateFailed() {
  75. if (isDebugMode())
  76. parserEventSupport.fireSyntacticPredicateFailed(inputState.guessing);
  77. }
  78. protected void fireSyntacticPredicateStarted() {
  79. if (isDebugMode())
  80. parserEventSupport.fireSyntacticPredicateStarted(inputState.guessing);
  81. }
  82. protected void fireSyntacticPredicateSucceeded() {
  83. if (isDebugMode())
  84. parserEventSupport.fireSyntacticPredicateSucceeded(inputState.guessing);
  85. }
  86. public String getRuleName(int num) {
  87. return ruleNames[num];
  88. }
  89. public String getSemPredName(int num) {
  90. return semPredNames[num];
  91. }
  92. public synchronized void goToSleep() {
  93. try {wait();}
  94. catch (InterruptedException e) { }
  95. }
  96. public boolean isDebugMode() {
  97. return !_notDebugMode;
  98. }
  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.  */
  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.  */
  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.  */
  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. }
  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. }
  158. public void removeMessageListener(MessageListener l) {
  159. parserEventSupport.removeMessageListener(l);
  160. }
  161. public void removeParserListener(ParserListener l) {
  162. parserEventSupport.removeParserListener(l);
  163. }
  164. public void removeParserMatchListener(ParserMatchListener l) {
  165. parserEventSupport.removeParserMatchListener(l);
  166. }
  167. public void removeParserTokenListener(ParserTokenListener l) {
  168. parserEventSupport.removeParserTokenListener(l);
  169. }
  170. public void removeSemanticPredicateListener(SemanticPredicateListener l) {
  171. parserEventSupport.removeSemanticPredicateListener(l);
  172. }
  173. public void removeSyntacticPredicateListener(SyntacticPredicateListener l) {
  174. parserEventSupport.removeSyntacticPredicateListener(l);
  175. }
  176. public void removeTraceListener(TraceListener l) {
  177. parserEventSupport.removeTraceListener(l);
  178. }
  179. /** Parser error-reporting function can be overridden in subclass */
  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 */
  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 */
  190. public void reportWarning(String s) {
  191. parserEventSupport.fireReportWarning(s);
  192. super.reportWarning(s);
  193. }
  194. public void setDebugMode(boolean value) {
  195. _notDebugMode = !value;
  196. }
  197. public void setupDebugging(TokenBuffer tokenBuf) {
  198. setupDebugging(null, tokenBuf);
  199. }
  200. public void setupDebugging(TokenStream lexer) {
  201. setupDebugging(lexer, null);
  202. }
  203. /** User can override to do their own debugging */
  204. protected void setupDebugging(TokenStream lexer, TokenBuffer tokenBuf) {
  205. setDebugMode(true);
  206. // default parser debug setup is ParseView
  207. try {
  208. try {
  209. Class.forName("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 = Class.forName("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. }
  225. public synchronized void wakeUp() {
  226. notify();
  227. }
  228. }