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

编译器/解释器

开发平台:

Others

  1. package antlr.debug;
  2. import java.util.Vector;
  3. import antlr.collections.impl.BitSet;
  4. import antlr.RecognitionException;
  5. public class InputBufferEventSupport {
  6. private Object source;
  7. private Vector inputBufferListeners;
  8. private InputBufferEvent  inputBufferEvent;
  9. protected static final int CONSUME=0;
  10. protected static final int LA=1;
  11. protected static final int MARK=2;
  12. protected static final int REWIND=3;
  13. public InputBufferEventSupport(Object source) {
  14. inputBufferEvent = new InputBufferEvent(source);
  15. this.source = source;
  16. }
  17. public void addInputBufferListener(InputBufferListener l) {
  18. if (inputBufferListeners == null) inputBufferListeners = new Vector();
  19. inputBufferListeners.addElement(l);
  20. }
  21. public void fireConsume(char c) {
  22. inputBufferEvent.setValues(InputBufferEvent.CONSUME, c, 0);
  23. fireEvents(CONSUME, inputBufferListeners);
  24. }
  25. public void fireEvent(int type, ListenerBase l) {
  26. switch(type) {
  27. case CONSUME: ((InputBufferListener)l).inputBufferConsume(inputBufferEvent); break;
  28. case LA:      ((InputBufferListener)l).inputBufferLA(inputBufferEvent); break;
  29. case MARK:    ((InputBufferListener)l).inputBufferMark(inputBufferEvent); break;
  30. case REWIND:  ((InputBufferListener)l).inputBufferRewind(inputBufferEvent); break;
  31. default:
  32. throw new IllegalArgumentException("bad type "+type+" for fireEvent()");
  33. }
  34. }
  35. public void fireEvents(int type, Vector listeners) {
  36. Vector targets=null;
  37. ListenerBase l=null;
  38. synchronized (this) {
  39. if (listeners == null) return;
  40. targets = (Vector)listeners.clone();
  41. }
  42. if (targets != null)
  43. for (int i = 0; i < targets.size(); i++) {
  44. l = (ListenerBase)targets.elementAt(i);
  45. fireEvent(type, l);
  46. }
  47. }
  48. public void fireLA(char c, int la) {
  49. inputBufferEvent.setValues(InputBufferEvent.LA, c, la);
  50. fireEvents(LA, inputBufferListeners);
  51. }
  52. public void fireMark(int pos) {
  53. inputBufferEvent.setValues(InputBufferEvent.MARK, ' ', pos);
  54. fireEvents(MARK, inputBufferListeners);
  55. }
  56. public void fireRewind(int pos) {
  57. inputBufferEvent.setValues(InputBufferEvent.REWIND, ' ', pos);
  58. fireEvents(REWIND, inputBufferListeners);
  59. }
  60. public Vector getInputBufferListeners() {
  61. return inputBufferListeners;
  62. }
  63. protected void refresh(Vector listeners) {
  64. Vector v;
  65. synchronized (listeners) {
  66. v = (Vector)listeners.clone();
  67. }
  68. if (v != null)
  69. for (int i = 0; i < v.size(); i++)
  70. ((ListenerBase)v.elementAt(i)).refresh();
  71. }
  72. public void refreshListeners() {
  73. refresh(inputBufferListeners);
  74. }
  75. public void removeInputBufferListener(InputBufferListener l) {
  76. if (inputBufferListeners != null)
  77. inputBufferListeners.removeElement(l);
  78. }
  79. }