PageRenderTime 45ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/antlr-2.7.5/lib/cpp/src/TokenStreamHiddenTokenFilter.cpp

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