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

编译器/解释器

开发平台:

Others

  1. #include "antlr/TokenStreamHiddenTokenFilter.hpp"
  2. #include "antlr/CommonHiddenStreamToken.hpp"
  3. ANTLR_BEGIN_NAMESPACE(antlr)
  4. /**This object filters a token stream coming from a lexer
  5.  * or another TokenStream so that only certain token channels
  6.  * get transmitted to the parser.
  7.  *
  8.  * Any of the channels can be filtered off as "hidden" channels whose
  9.  * tokens can be accessed from the parser.
  10.  */
  11. TokenStreamHiddenTokenFilter::TokenStreamHiddenTokenFilter(TokenStream& input)
  12. : TokenStreamBasicFilter(input)
  13. {
  14. }
  15. void TokenStreamHiddenTokenFilter::consume()
  16. {
  17. nextMonitoredToken = input->nextToken();
  18. }
  19. void TokenStreamHiddenTokenFilter::consumeFirst()
  20. {
  21. consume();
  22. // Handle situation where hidden or discarded tokens
  23. // appear first in input stream
  24. RefToken p;
  25. // while hidden or discarded scarf tokens
  26. while ( hideMask.member(LA(1)->getType()) || discardMask.member(LA(1)->getType()) ) {
  27. if ( hideMask.member(LA(1)->getType()) ) {
  28. if ( !p ) {
  29. p = LA(1);
  30. }
  31. else {
  32. static_cast<CommonHiddenStreamToken*>(p.get())->setHiddenAfter(LA(1));
  33. static_cast<CommonHiddenStreamToken*>(LA(1).get())->setHiddenBefore(p); // double-link
  34. p = LA(1);
  35. }
  36. lastHiddenToken = p;
  37. if (!firstHidden)
  38. firstHidden = p; // record hidden token if first
  39. }
  40. consume();
  41. }
  42. }
  43. BitSet TokenStreamHiddenTokenFilter::getDiscardMask() const
  44. {
  45. return discardMask;
  46. }
  47. /** Return a ptr to the hidden token appearing immediately after
  48.  *  token t in the input stream.
  49.  */
  50. RefToken TokenStreamHiddenTokenFilter::getHiddenAfter(RefToken t)
  51. {
  52. return static_cast<CommonHiddenStreamToken*>(t.get())->getHiddenAfter();
  53. }
  54. /** Return a ptr to the hidden token appearing immediately before
  55.  *  token t in the input stream.
  56.  */
  57. RefToken TokenStreamHiddenTokenFilter::getHiddenBefore(RefToken t)
  58. {
  59. return static_cast<CommonHiddenStreamToken*>(t.get())->getHiddenBefore();
  60. }
  61. BitSet TokenStreamHiddenTokenFilter::getHideMask() const
  62. {
  63. return hideMask;
  64. }
  65. /** Return the first hidden token if one appears
  66.  *  before any monitored token.
  67.  */
  68. RefToken TokenStreamHiddenTokenFilter::getInitialHiddenToken()
  69. {
  70. return firstHidden;
  71. }
  72. void TokenStreamHiddenTokenFilter::hide(int m)
  73. {
  74. hideMask.add(m);
  75. }
  76. void TokenStreamHiddenTokenFilter::hide(const BitSet& mask)
  77. {
  78. hideMask = mask;
  79. }
  80. RefToken TokenStreamHiddenTokenFilter::LA(int i)
  81. {
  82. return nextMonitoredToken;
  83. }
  84. /** Return the next monitored token.
  85. *  Test the token following the monitored token.
  86. *  If following is another monitored token, save it
  87. *  for the next invocation of nextToken (like a single
  88. *  lookahead token) and return it then.
  89. *  If following is unmonitored, nondiscarded (hidden)
  90. *  channel token, add it to the monitored token.
  91. *
  92. *  Note: EOF must be a monitored Token.
  93. */
  94. RefToken TokenStreamHiddenTokenFilter::nextToken()
  95. {
  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) ) {
  99. consumeFirst();
  100. }
  101. // we always consume hidden tokens after monitored, thus,
  102. // upon entry LA(1) is a monitored token.
  103. RefToken monitored = LA(1);
  104. // point to hidden tokens found during last invocation
  105. static_cast<CommonHiddenStreamToken*>(monitored.get())->setHiddenBefore(lastHiddenToken);
  106. lastHiddenToken = nullToken;
  107. // Look for hidden tokens, hook them into list emanating
  108. // from the monitored tokens.
  109. consume();
  110. RefToken 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. static_cast<CommonHiddenStreamToken*>(p.get())->setHiddenAfter(LA(1));
  117. // link backwards
  118. if (p != monitored) { //hidden cannot point to monitored tokens
  119. static_cast<CommonHiddenStreamToken*>(LA(1).get())->setHiddenBefore(p);
  120. }
  121. p = lastHiddenToken = LA(1);
  122. }
  123. consume();
  124. }
  125. return monitored;
  126. }
  127. ANTLR_END_NAMESPACE