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

编译器/解释器

开发平台:

Others

  1. package antlr.debug;
  2. import java.util.Vector;
  3. import java.util.Hashtable;
  4. import java.util.Enumeration;
  5. import antlr.collections.impl.BitSet;
  6. import antlr.RecognitionException;
  7. /** A class to assist in firing parser events
  8.  *  NOTE: I intentionally _did_not_ synchronize the event firing and
  9.  *        add/remove listener methods.  This is because the add/remove should
  10.  *        _only_ be called by the parser at its start/end, and the _same_thread_
  11.  *        should be performing the parsing.  This should help performance a tad...
  12.  */
  13. public class ParserEventSupport {
  14. private Object source;
  15. private Hashtable doneListeners;
  16. private Vector matchListeners;
  17. private Vector messageListeners;
  18. private Vector tokenListeners;
  19. private Vector traceListeners;
  20. private Vector semPredListeners;
  21. private Vector synPredListeners;
  22. private Vector newLineListeners;
  23. private ParserMatchEvent        matchEvent;
  24. private MessageEvent            messageEvent;
  25. private ParserTokenEvent        tokenEvent;
  26. private SemanticPredicateEvent  semPredEvent;
  27. private SyntacticPredicateEvent synPredEvent;
  28. private TraceEvent              traceEvent;
  29. private NewLineEvent            newLineEvent;
  30. private ParserController        controller;
  31. protected static final int CONSUME=0;
  32. protected static final int ENTER_RULE=1;
  33. protected static final int EXIT_RULE=2;
  34. protected static final int LA=3;
  35. protected static final int MATCH=4;
  36. protected static final int MATCH_NOT=5;
  37. protected static final int MISMATCH=6;
  38. protected static final int MISMATCH_NOT=7;
  39. protected static final int REPORT_ERROR=8;
  40. protected static final int REPORT_WARNING=9;
  41. protected static final int SEMPRED=10;
  42. protected static final int SYNPRED_FAILED=11;
  43. protected static final int SYNPRED_STARTED=12;
  44. protected static final int SYNPRED_SUCCEEDED=13;
  45. protected static final int NEW_LINE=14;
  46. protected static final int DONE_PARSING=15;
  47. private int ruleDepth = 0;
  48. public ParserEventSupport(Object source) {
  49. matchEvent   = new ParserMatchEvent(source);
  50. messageEvent = new MessageEvent(source);
  51. tokenEvent   = new ParserTokenEvent(source);
  52. traceEvent   = new TraceEvent(source);
  53. semPredEvent = new SemanticPredicateEvent(source);
  54. synPredEvent = new SyntacticPredicateEvent(source);
  55. newLineEvent = new NewLineEvent(source);
  56. this.source = source;
  57. }
  58. public void addDoneListener(ListenerBase l) {
  59. if (doneListeners == null) doneListeners = new Hashtable();
  60. Integer i = (Integer)doneListeners.get(l);
  61. int val;
  62. if (i != null)
  63. val = i.intValue() + 1;
  64. else
  65. val = 1;
  66. doneListeners.put(l, new Integer(val));
  67. }
  68. public void addMessageListener(MessageListener l) {
  69. if (messageListeners == null) messageListeners = new Vector();
  70. messageListeners.addElement(l);
  71. addDoneListener(l);
  72. }
  73. public void addNewLineListener(NewLineListener l) {
  74. if (newLineListeners == null) newLineListeners = new Vector();
  75. newLineListeners.addElement(l);
  76. addDoneListener(l);
  77. }
  78. public void addParserListener(ParserListener l) {
  79. if (l instanceof ParserController) {
  80. ((ParserController)l).setParserEventSupport(this);
  81. controller = (ParserController)l;
  82. }
  83. addParserMatchListener(l);
  84. addParserTokenListener(l);
  85. addMessageListener(l);
  86. addTraceListener(l);
  87. addSemanticPredicateListener(l);
  88. addSyntacticPredicateListener(l);
  89. }
  90. public void addParserMatchListener(ParserMatchListener l) {
  91. if (matchListeners == null) matchListeners = new Vector();
  92. matchListeners.addElement(l);
  93. addDoneListener(l);
  94. }
  95. public void addParserTokenListener(ParserTokenListener l) {
  96. if (tokenListeners == null) tokenListeners = new Vector();
  97. tokenListeners.addElement(l);
  98. addDoneListener(l);
  99. }
  100. public void addSemanticPredicateListener(SemanticPredicateListener l) {
  101. if (semPredListeners == null) semPredListeners = new Vector();
  102. semPredListeners.addElement(l);
  103. addDoneListener(l);
  104. }
  105. public void addSyntacticPredicateListener(SyntacticPredicateListener l) {
  106. if (synPredListeners == null) synPredListeners = new Vector();
  107. synPredListeners.addElement(l);
  108. addDoneListener(l);
  109. }
  110. public void addTraceListener(TraceListener l) {
  111. if (traceListeners == null) traceListeners = new Vector();
  112. traceListeners.addElement(l);
  113. addDoneListener(l);
  114. }
  115. public void fireConsume(int value) {
  116. tokenEvent.setValues(ParserTokenEvent.CONSUME, 1, value);
  117. fireEvents(CONSUME, tokenListeners);
  118. }
  119. public void fireDoneParsing() {
  120. traceEvent.setValues(TraceEvent.DONE_PARSING, 0,0,0);
  121. Hashtable targets=null;
  122. // Hashtable targets=doneListeners;
  123. ListenerBase l=null;
  124. synchronized (this) {
  125. if (doneListeners == null) return;
  126. targets = (Hashtable)doneListeners.clone();
  127. }
  128. if (targets != null) {
  129. Enumeration e = targets.keys();
  130. while(e.hasMoreElements()) {
  131. l = (ListenerBase)e.nextElement();
  132. fireEvent(DONE_PARSING, l);
  133. }
  134. }
  135. if (controller != null)
  136. controller.checkBreak();
  137. }
  138. public void fireEnterRule(int ruleNum, int guessing, int data) {
  139. ruleDepth++;
  140. traceEvent.setValues(TraceEvent.ENTER, ruleNum, guessing, data);
  141. fireEvents(ENTER_RULE, traceListeners);
  142. }
  143. public void fireEvent(int type, ListenerBase l) {
  144. switch(type) {
  145. case CONSUME:    ((ParserTokenListener)l).parserConsume(tokenEvent); break;
  146. case LA:         ((ParserTokenListener)l).parserLA(tokenEvent);      break;
  147. case ENTER_RULE: ((TraceListener)l).enterRule(traceEvent);           break;
  148. case EXIT_RULE:  ((TraceListener)l).exitRule(traceEvent);            break;
  149. case MATCH:        ((ParserMatchListener)l).parserMatch(matchEvent);       break;
  150. case MATCH_NOT:    ((ParserMatchListener)l).parserMatchNot(matchEvent);    break;
  151. case MISMATCH:     ((ParserMatchListener)l).parserMismatch(matchEvent);    break;
  152. case MISMATCH_NOT: ((ParserMatchListener)l).parserMismatchNot(matchEvent); break;
  153. case SEMPRED:      ((SemanticPredicateListener)l).semanticPredicateEvaluated(semPredEvent); break;
  154. case SYNPRED_STARTED:   ((SyntacticPredicateListener)l).syntacticPredicateStarted(synPredEvent);   break;
  155. case SYNPRED_FAILED:    ((SyntacticPredicateListener)l).syntacticPredicateFailed(synPredEvent);    break;
  156. case SYNPRED_SUCCEEDED: ((SyntacticPredicateListener)l).syntacticPredicateSucceeded(synPredEvent); break;
  157. case REPORT_ERROR:   ((MessageListener)l).reportError(messageEvent);   break;
  158. case REPORT_WARNING: ((MessageListener)l).reportWarning(messageEvent); break;
  159. case DONE_PARSING: l.doneParsing(traceEvent); break;
  160. case NEW_LINE:     ((NewLineListener)l).hitNewLine(newLineEvent); break;
  161. default:
  162. throw new IllegalArgumentException("bad type "+type+" for fireEvent()");
  163. }
  164. }
  165. public void fireEvents(int type, Vector listeners) {
  166. ListenerBase l=null;
  167. if (listeners != null)
  168. for (int i = 0; i < listeners.size(); i++) {
  169. l = (ListenerBase)listeners.elementAt(i);
  170. fireEvent(type, l);
  171. }
  172. if (controller != null)
  173. controller.checkBreak();
  174. }
  175. public void fireExitRule(int ruleNum, int guessing, int data) {
  176. traceEvent.setValues(TraceEvent.EXIT, ruleNum, guessing, data);
  177. fireEvents(EXIT_RULE, traceListeners);
  178. ruleDepth--;
  179. if (ruleDepth == 0)
  180. fireDoneParsing();
  181. }
  182. public void fireLA(int k, int la) {
  183. tokenEvent.setValues(ParserTokenEvent.LA, k, la);
  184. fireEvents(LA, tokenListeners);
  185. }
  186. public void fireMatch(char c, int guessing) {
  187. matchEvent.setValues(ParserMatchEvent.CHAR, c, new Character(c), null, guessing, false, true);
  188. fireEvents(MATCH, matchListeners);
  189. }
  190. public void fireMatch(char value, BitSet b, int guessing) {
  191. matchEvent.setValues(ParserMatchEvent.CHAR_BITSET, value, b, null, guessing, false, true);
  192. fireEvents(MATCH, matchListeners);
  193. }
  194. public void fireMatch(char value, String target, int guessing) {
  195. matchEvent.setValues(ParserMatchEvent.CHAR_RANGE, value, target, null, guessing, false, true);
  196. fireEvents(MATCH, matchListeners);
  197. }
  198. public void fireMatch(int value, BitSet b, String text, int guessing) {
  199. matchEvent.setValues(ParserMatchEvent.BITSET, value, b, text, guessing, false, true);
  200. fireEvents(MATCH, matchListeners);
  201. }
  202. public void fireMatch(int n, String text, int guessing) {
  203. matchEvent.setValues(ParserMatchEvent.TOKEN, n, new Integer(n), text, guessing, false, true);
  204. fireEvents(MATCH, matchListeners);
  205. }
  206. public void fireMatch(String s, int guessing) {
  207. matchEvent.setValues(ParserMatchEvent.STRING, 0, s, null, guessing, false, true);
  208. fireEvents(MATCH, matchListeners);
  209. }
  210. public void fireMatchNot(char value, char n, int guessing) {
  211. matchEvent.setValues(ParserMatchEvent.CHAR, value, new Character(n), null, guessing, true, true);
  212. fireEvents(MATCH_NOT, matchListeners);
  213. }
  214. public void fireMatchNot(int value, int n, String text, int guessing) {
  215. matchEvent.setValues(ParserMatchEvent.TOKEN, value, new Integer(n), text, guessing, true, true);
  216. fireEvents(MATCH_NOT, matchListeners);
  217. }
  218. public void fireMismatch(char value, char n, int guessing) {
  219. matchEvent.setValues(ParserMatchEvent.CHAR, value, new Character(n), null, guessing, false, false);
  220. fireEvents(MISMATCH, matchListeners);
  221. }
  222. public void fireMismatch(char value, BitSet b, int guessing) {
  223. matchEvent.setValues(ParserMatchEvent.CHAR_BITSET, value, b, null, guessing, false, true);
  224. fireEvents(MISMATCH, matchListeners);
  225. }
  226. public void fireMismatch(char value, String target, int guessing) {
  227. matchEvent.setValues(ParserMatchEvent.CHAR_RANGE, value, target, null, guessing, false, true);
  228. fireEvents(MISMATCH, matchListeners);
  229. }
  230. public void fireMismatch(int value, int n, String text, int guessing) {
  231. matchEvent.setValues(ParserMatchEvent.TOKEN, value, new Integer(n), text, guessing, false, false);
  232. fireEvents(MISMATCH, matchListeners);
  233. }
  234. public void fireMismatch(int value, BitSet b, String text, int guessing) {
  235. matchEvent.setValues(ParserMatchEvent.BITSET, value, b, text, guessing, false, true);
  236. fireEvents(MISMATCH, matchListeners);
  237. }
  238. public void fireMismatch(String value, String text, int guessing) {
  239. matchEvent.setValues(ParserMatchEvent.STRING, 0, text, value, guessing, false, true);
  240. fireEvents(MISMATCH, matchListeners);
  241. }
  242. public void fireMismatchNot(char value, char c, int guessing) {
  243. matchEvent.setValues(ParserMatchEvent.CHAR, value, new Character(c), null, guessing, true, true);
  244. fireEvents(MISMATCH_NOT, matchListeners);
  245. }
  246. public void fireMismatchNot(int value, int n, String text, int guessing) {
  247. matchEvent.setValues(ParserMatchEvent.TOKEN, value, new Integer(n), text, guessing, true, true);
  248. fireEvents(MISMATCH_NOT, matchListeners);
  249. }
  250. public void fireNewLine(int line) {
  251. newLineEvent.setValues(line);
  252. fireEvents(NEW_LINE, newLineListeners);
  253. }
  254. public void fireReportError(Exception e) {
  255. messageEvent.setValues(MessageEvent.ERROR, e.toString());
  256. fireEvents(REPORT_ERROR, messageListeners);
  257. }
  258. public void fireReportError(String s) {
  259. messageEvent.setValues(MessageEvent.ERROR, s);
  260. fireEvents(REPORT_ERROR, messageListeners);
  261. }
  262. public void fireReportWarning(String s) {
  263. messageEvent.setValues(MessageEvent.WARNING, s);
  264. fireEvents(REPORT_WARNING, messageListeners);
  265. }
  266. public boolean fireSemanticPredicateEvaluated(int type, int condition, boolean result, int guessing) {
  267. semPredEvent.setValues(type, condition, result, guessing);
  268. fireEvents(SEMPRED, semPredListeners);
  269. return result;
  270. }
  271. public void fireSyntacticPredicateFailed(int guessing) {
  272. synPredEvent.setValues(0, guessing);
  273. fireEvents(SYNPRED_FAILED, synPredListeners);
  274. }
  275. public void fireSyntacticPredicateStarted(int guessing) {
  276. synPredEvent.setValues(0, guessing);
  277. fireEvents(SYNPRED_STARTED, synPredListeners);
  278. }
  279. public void fireSyntacticPredicateSucceeded(int guessing) {
  280. synPredEvent.setValues(0, guessing);
  281. fireEvents(SYNPRED_SUCCEEDED, synPredListeners);
  282. }
  283. protected void refresh(Vector listeners) {
  284. Vector v;
  285. synchronized (listeners) {
  286. v = (Vector)listeners.clone();
  287. }
  288. if (v != null)
  289. for (int i = 0; i < v.size(); i++)
  290. ((ListenerBase)v.elementAt(i)).refresh();
  291. }
  292. public void refreshListeners() {
  293. refresh(matchListeners);
  294. refresh(messageListeners);
  295. refresh(tokenListeners);
  296. refresh(traceListeners);
  297. refresh(semPredListeners);
  298. refresh(synPredListeners);
  299. }
  300. public void removeDoneListener(ListenerBase l) {
  301. if (doneListeners == null) return;
  302. Integer i = (Integer)doneListeners.get(l);
  303. int val=0;
  304. if (i != null)
  305. val = i.intValue() - 1;
  306. if (val == 0) 
  307. doneListeners.remove(l);
  308. else
  309. doneListeners.put(l, new Integer(val));
  310. }
  311. public void removeMessageListener(MessageListener l) {
  312. if (messageListeners != null)
  313. messageListeners.removeElement(l);
  314. removeDoneListener(l);
  315. }
  316. public void removeNewLineListener(NewLineListener l) {
  317. if (newLineListeners != null)
  318. newLineListeners.removeElement(l);
  319. removeDoneListener(l);
  320. }
  321. public void removeParserListener(ParserListener l) {
  322. removeParserMatchListener(l);
  323. removeMessageListener(l);
  324. removeParserTokenListener(l);
  325. removeTraceListener(l);
  326. removeSemanticPredicateListener(l);
  327. removeSyntacticPredicateListener(l);
  328. }
  329. public void removeParserMatchListener(ParserMatchListener l) {
  330. if (matchListeners != null)
  331. matchListeners.removeElement(l);
  332. removeDoneListener(l);
  333. }
  334. public void removeParserTokenListener(ParserTokenListener l) {
  335. if (tokenListeners != null)
  336. tokenListeners.removeElement(l);
  337. removeDoneListener(l);
  338. }
  339. public void removeSemanticPredicateListener(SemanticPredicateListener l) {
  340. if (semPredListeners != null)
  341. semPredListeners.removeElement(l);
  342. removeDoneListener(l);
  343. }
  344. public void removeSyntacticPredicateListener(SyntacticPredicateListener l) {
  345. if (synPredListeners != null)
  346. synPredListeners.removeElement(l);
  347. removeDoneListener(l);
  348. }
  349. public void removeTraceListener(TraceListener l) {
  350. if (traceListeners != null)
  351. traceListeners.removeElement(l);
  352. removeDoneListener(l);
  353. }
  354. }