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

编译器/解释器

开发平台:

Others

  1. package antlr;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/TokenStreamHiddenTokenFilter.java#1 $
  7.  */
  8. import antlr.collections.impl.BitSet;
  9. /**This object filters a token stream coming from a lexer
  10.  * or another TokenStream so that only certain token channels
  11.  * get transmitted to the parser.
  12.  *
  13.  * Any of the channels can be filtered off as "hidden" channels whose
  14.  * tokens can be accessed from the parser.
  15.  */
  16. public class TokenStreamHiddenTokenFilter extends TokenStreamBasicFilter implements TokenStream {
  17. // protected BitSet discardMask;
  18. protected BitSet hideMask;
  19. private CommonHiddenStreamToken nextMonitoredToken;
  20. /** track tail of hidden list emanating from previous
  21.  *  monitored token
  22.  */
  23. protected CommonHiddenStreamToken lastHiddenToken;
  24. protected CommonHiddenStreamToken firstHidden = null;
  25. public TokenStreamHiddenTokenFilter(TokenStream input) {
  26. super(input);
  27. hideMask = new BitSet();
  28. }
  29. protected void consume() throws TokenStreamException {
  30. nextMonitoredToken = (CommonHiddenStreamToken)input.nextToken();
  31. }
  32. private void consumeFirst() throws TokenStreamException {
  33. consume(); // get first token of input stream
  34. // Handle situation where hidden or discarded tokens
  35. // appear first in input stream
  36. CommonHiddenStreamToken p=null;
  37. // while hidden or discarded scarf tokens
  38. while ( hideMask.member(LA(1).getType()) || discardMask.member(LA(1).getType()) ) {
  39. if ( hideMask.member(LA(1).getType()) ) {
  40. if ( p==null ) {
  41. p = LA(1);
  42. }
  43. else {
  44. p.setHiddenAfter(LA(1));
  45. LA(1).setHiddenBefore(p); // double-link
  46. p = LA(1);
  47. }
  48. lastHiddenToken = p;
  49. if (firstHidden==null) {
  50. firstHidden = p; // record hidden token if first
  51. }
  52. }
  53. consume();
  54. }
  55. }
  56. public BitSet getDiscardMask() {return discardMask;}
  57. /** Return a ptr to the hidden token appearing immediately after
  58.  *  token t in the input stream.
  59.  */
  60. public CommonHiddenStreamToken getHiddenAfter(CommonHiddenStreamToken t) {
  61. return t.getHiddenAfter();
  62. }
  63. /** Return a ptr to the hidden token appearing immediately before
  64.  *  token t in the input stream.
  65.  */
  66. public CommonHiddenStreamToken getHiddenBefore(CommonHiddenStreamToken t) {
  67. return t.getHiddenBefore();
  68. }
  69. public BitSet getHideMask()    {return hideMask;}
  70. /** Return the first hidden token if one appears
  71.  *  before any monitored token.
  72.  */
  73. public CommonHiddenStreamToken getInitialHiddenToken() {
  74. return firstHidden;
  75. }
  76. public void hide(int m) {
  77. hideMask.add(m);
  78. }
  79. public void hide(BitSet mask) {
  80. hideMask = mask;
  81. }
  82. protected CommonHiddenStreamToken LA(int i) {
  83. return nextMonitoredToken;
  84. }
  85. /** Return the next monitored token.
  86.  *  Test the token following the monitored token.
  87.  *  If following is another monitored token, save it
  88.  *  for the next invocation of nextToken (like a single
  89.  *  lookahead token) and return it then.
  90.  *  If following is unmonitored, nondiscarded (hidden)
  91.  *  channel token, add it to the monitored token.
  92.  *
  93.  *  Note: EOF must be a monitored Token.
  94.  */
  95. public Token nextToken() throws TokenStreamException {
  96. // handle an initial condition; don't want to get lookahead
  97. // token of this splitter until first call to nextToken
  98. if ( LA(1)==null ) {
  99. consumeFirst();
  100. }
  101. // we always consume hidden tokens after monitored, thus,
  102. // upon entry LA(1) is a monitored token.
  103. CommonHiddenStreamToken monitored = LA(1);
  104. // point to hidden tokens found during last invocation
  105. monitored.setHiddenBefore(lastHiddenToken);
  106. lastHiddenToken = null;
  107. // Look for hidden tokens, hook them into list emanating
  108. // from the monitored tokens.
  109. consume();
  110. CommonHiddenStreamToken p = monitored;
  111. // while hidden or discarded scarf tokens
  112. while ( hideMask.member(LA(1).getType()) || discardMask.member(LA(1).getType()) ) {
  113. if ( hideMask.member(LA(1).getType()) ) {
  114. // attach the hidden token to the monitored in a chain
  115. // link forwards
  116. p.setHiddenAfter(LA(1));
  117. // link backwards
  118. if (p != monitored) { //hidden cannot point to monitored tokens
  119. LA(1).setHiddenBefore(p);
  120. }
  121. p = lastHiddenToken = LA(1);
  122. }
  123. consume();
  124. }
  125. return monitored;
  126. }
  127. }