antlr3rewritestreams.inl 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. namespace antlr3 {
  2. template<class ImplTraits, class ElementType>
  3. RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
  4. const char* description)
  5. {
  6. this->init(adaptor, description);
  7. }
  8. template<class ImplTraits, class ElementType>
  9. RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
  10. const char* description,
  11. const ElementType* oneElement)
  12. {
  13. this->init(adaptor, description);
  14. if( oneElement != NULL )
  15. this->add( oneElement );
  16. }
  17. template<class ImplTraits, class ElementType>
  18. RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
  19. const char* description,
  20. const ElementsType& elements)
  21. : m_elements(elements)
  22. {
  23. this->init(adaptor, description);
  24. }
  25. template<class ImplTraits, class ElementType>
  26. void RewriteRuleElementStream<ImplTraits, ElementType>::init(TreeAdaptorType* adaptor,
  27. const char* description)
  28. {
  29. m_adaptor = adaptor;
  30. m_cursor = 0;
  31. m_dirty = false;
  32. }
  33. template<class ImplTraits>
  34. RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
  35. const char* description)
  36. //: BaseType(adaptor, description)
  37. {
  38. }
  39. template<class ImplTraits>
  40. RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
  41. const char* description,
  42. const TokenType* oneElement)
  43. //: BaseType(adaptor, description, oneElement)
  44. {
  45. }
  46. template<class ImplTraits>
  47. RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
  48. const char* description,
  49. const ElementsType& elements)
  50. //: BaseType(adaptor, description, elements)
  51. {
  52. }
  53. template<class ImplTraits>
  54. RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
  55. const char* description)
  56. //: BaseType(adaptor, description)
  57. {
  58. }
  59. template<class ImplTraits>
  60. RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
  61. const char* description,
  62. TreeTypePtr& oneElement)
  63. //: BaseType(adaptor, description, oneElement)
  64. {
  65. }
  66. template<class ImplTraits>
  67. RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
  68. const char* description,
  69. const ElementsType& elements)
  70. //: BaseType(adaptor, description, elements)
  71. {
  72. }
  73. /*
  74. template<class ImplTraits>
  75. RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
  76. const char* description)
  77. : BaseType(adaptor, description)
  78. {
  79. }
  80. template<class ImplTraits>
  81. RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
  82. const char* description,
  83. TokenType* oneElement)
  84. : BaseType(adaptor, description, oneElement)
  85. {
  86. }
  87. template<class ImplTraits>
  88. RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
  89. const char* description,
  90. const ElementsType& elements)
  91. : BaseType(adaptor, description, elements)
  92. {
  93. }
  94. */
  95. template<class ImplTraits, class ElementType>
  96. void RewriteRuleElementStream<ImplTraits, ElementType>::reset()
  97. {
  98. m_cursor = 0;
  99. m_dirty = true;
  100. }
  101. template<class ImplTraits, class ElementType>
  102. void RewriteRuleElementStream<ImplTraits, ElementType>::add(ElementType* el)
  103. {
  104. if ( el== NULL )
  105. return;
  106. m_elements.push_back(el);
  107. }
  108. template<class ImplTraits, class ElementType>
  109. ElementType* RewriteRuleElementStream<ImplTraits, ElementType>::_next()
  110. {
  111. ANTLR_UINT32 n = this->size();
  112. if (n == 0)
  113. {
  114. // This means that the stream is empty
  115. return NULL; // Caller must cope with this (TODO throw RewriteEmptyStreamException)
  116. }
  117. // Traversed all the available elements already?
  118. if ( m_cursor >= n) // out of elements?
  119. {
  120. if (n == 1)
  121. {
  122. // Special case when size is single element, it will just dup a lot
  123. //return this->toTree(m_singleElement);
  124. return this->toTree(m_elements.at(0));
  125. }
  126. // Out of elements and the size is not 1, so we cannot assume
  127. // that we just duplicate the entry n times (such as ID ent+ -> ^(ID ent)+)
  128. // This means we ran out of elements earlier than was expected.
  129. //
  130. return NULL; // Caller must cope with this (TODO throw RewriteEmptyStreamException)
  131. }
  132. // More than just a single element so we extract it from the
  133. // vector.
  134. ElementType* t = this->toTree(m_elements.at(m_cursor));
  135. m_cursor++;
  136. return t;
  137. }
  138. template<class ImplTraits, class ElementType>
  139. ElementType
  140. RewriteRuleElementStream<ImplTraits, ElementType>::nextTree()
  141. {
  142. ANTLR_UINT32 n = this->size();
  143. if ( m_dirty || ( (m_cursor >=n) && (n==1)) )
  144. {
  145. // if out of elements and size is 1, dup
  146. ElementType* el = this->_next();
  147. return this->dup(el);
  148. }
  149. // test size above then fetch
  150. ElementType* el = this->_next();
  151. return el;
  152. }
  153. /*
  154. template<class ImplTraits, class SuperType>
  155. typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
  156. RewriteRuleElementStream<ImplTraits, SuperType>::nextToken()
  157. {
  158. return this->_next();
  159. }
  160. template<class ImplTraits, class SuperType>
  161. typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
  162. RewriteRuleElementStream<ImplTraits, SuperType>::next()
  163. {
  164. ANTLR_UINT32 s;
  165. s = this->size();
  166. if ( (m_cursor >= s) && (s == 1) )
  167. {
  168. TreeTypePtr el;
  169. el = this->_next();
  170. return this->dup(el);
  171. }
  172. return this->_next();
  173. }
  174. */
  175. template<class ImplTraits, class ElementType>
  176. ElementType*
  177. RewriteRuleElementStream<ImplTraits, ElementType>::dup( ElementType* element)
  178. {
  179. return dupImpl(element);
  180. }
  181. template<class ImplTraits, class ElementType>
  182. ElementType*
  183. RewriteRuleElementStream<ImplTraits, ElementType>::dupImpl( typename ImplTraits::CommonTokenType* element)
  184. {
  185. return NULL; // TODO throw here
  186. }
  187. template<class ImplTraits, class ElementType>
  188. ElementType*
  189. RewriteRuleElementStream<ImplTraits, ElementType>::dupImpl( typename ImplTraits::TreeTypePtr element)
  190. {
  191. return m_adaptor->dupTree(element);
  192. }
  193. template<class ImplTraits>
  194. typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr
  195. RewriteRuleSubtreeStream<ImplTraits>::dup(TreeTypePtr element)
  196. {
  197. return this->dupTree(element);
  198. }
  199. template<class ImplTraits>
  200. typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr
  201. RewriteRuleSubtreeStream<ImplTraits>::dupTree(TreeTypePtr element)
  202. {
  203. return BaseType::m_adaptor->dupNode(element);
  204. }
  205. template<class ImplTraits, class ElementType>
  206. ElementType*
  207. RewriteRuleElementStream<ImplTraits, ElementType>::toTree( ElementType* element)
  208. {
  209. return element;
  210. }
  211. /*
  212. template<class ImplTraits>
  213. typename RewriteRuleNodeStream<ImplTraits>::TreeTypePtr
  214. RewriteRuleNodeStream<ImplTraits>::toTree(TreeTypePtr element)
  215. {
  216. return this->toTreeNode(element);
  217. }
  218. template<class ImplTraits>
  219. typename RewriteRuleNodeStream<ImplTraits>::TreeTypePtr
  220. RewriteRuleNodeStream<ImplTraits>::toTreeNode(TreeTypePtr element)
  221. {
  222. return BaseType::m_adaptor->dupNode(element);
  223. }
  224. */
  225. template<class ImplTraits, class ElementType>
  226. bool RewriteRuleElementStream<ImplTraits, ElementType>::hasNext()
  227. {
  228. if ( !m_elements.empty() && m_cursor < m_elements.size())
  229. {
  230. return true;
  231. }
  232. else
  233. {
  234. return false;
  235. }
  236. }
  237. template<class ImplTraits >
  238. typename RewriteRuleTokenStream<ImplTraits>::TreeTypePtr
  239. RewriteRuleTokenStream<ImplTraits>::nextNode()
  240. {
  241. TokenType *Token = this->nextToken();
  242. //return BaseType::m_adaptor->create(Token);
  243. return m_adaptor->create(Token);
  244. }
  245. /*
  246. template<class ImplTraits>
  247. typename RewriteRuleTokenStream<ImplTraits>::TreeTypePtr
  248. RewriteRuleTokenStream<ImplTraits>::nextNodeToken()
  249. {
  250. return BaseType::m_adaptor->create(this->_next());
  251. }
  252. */
  253. /// Number of elements available in the stream
  254. ///
  255. template<class ImplTraits, class ElementType>
  256. ANTLR_UINT32 RewriteRuleElementStream<ImplTraits, ElementType>::size()
  257. {
  258. return (ANTLR_UINT32)(m_elements.size());
  259. }
  260. template<class ImplTraits, class ElementType>
  261. typename RewriteRuleElementStream<ImplTraits, ElementType>::StringType
  262. RewriteRuleElementStream<ImplTraits, ElementType>::getDescription()
  263. {
  264. if ( m_elementDescription.empty() )
  265. {
  266. m_elementDescription = "<unknown source>";
  267. }
  268. return m_elementDescription;
  269. }
  270. template<class ImplTraits, class ElementType>
  271. RewriteRuleElementStream<ImplTraits, ElementType>::~RewriteRuleElementStream()
  272. {
  273. // Before placing the stream back in the pool, we
  274. // need to clear any vector it has. This is so any
  275. // free pointers that are associated with the
  276. // entries are called. However, if this particular function is called
  277. // then we know that the entries in the stream are definitely
  278. // tree nodes. Hence we check to see if any of them were nilNodes as
  279. // if they were, we can reuse them.
  280. //
  281. // We have some elements to traverse
  282. //
  283. for (ANTLR_UINT32 i = 0; i < m_elements.size(); i++)
  284. {
  285. ElementType *tree = m_elements.at(i);
  286. //if ( (tree != NULL) && tree->isNilNode() )
  287. {
  288. // Had to remove this for now, check is not comprehensive enough
  289. // tree->reuse(tree);
  290. }
  291. }
  292. m_elements.clear();
  293. }
  294. template<class ImplTraits>
  295. typename RewriteRuleTokenStream<ImplTraits>::TokenType*
  296. RewriteRuleTokenStream<ImplTraits>::nextToken()
  297. {
  298. return this->_next();
  299. }
  300. template<class ImplTraits>
  301. typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr
  302. RewriteRuleSubtreeStream<ImplTraits>::nextNode(TreeTypePtr element)
  303. {
  304. //System.out.println("nextNode: elements="+elements+", singleElement="+((Tree)singleElement).toStringTree());
  305. ANTLR_UINT32 n = this->size();
  306. if ( BaseType::m_dirty || (BaseType::m_cursor>=n && n==1) ) {
  307. // if out of elements and size is 1, dup (at most a single node
  308. // since this is for making root nodes).
  309. TreeTypePtr el = this->_next();
  310. return BaseType::m_adaptor->dupNode(el);
  311. }
  312. // test size above then fetch
  313. TreeType *tree = this->_next();
  314. while (BaseType::m_adaptor.isNil(tree) && BaseType::m_adaptor.getChildCount(tree) == 1)
  315. tree = BaseType::m_adaptor->getChild(tree, 0);
  316. //System.out.println("_next="+((Tree)tree).toStringTree());
  317. TreeType *el = BaseType::m_adaptor->dupNode(tree); // dup just the root (want node here)
  318. return el;
  319. }
  320. }