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

编译器/解释器

开发平台:

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/ASTIterator.java#1 $
  7.  */
  8. import antlr.collections.AST;
  9. public class ASTIterator {
  10.     protected AST cursor = null;
  11.     protected AST original = null;
  12.     public ASTIterator(AST t) {
  13. original = cursor = t;
  14.     }
  15.     /** Is 'sub' a subtree of 't' beginning at the root? */
  16.     public boolean isSubtree(AST t, AST sub) {
  17. AST sibling;
  18. // the empty tree is always a subset of any tree.
  19. if ( sub==null ) {
  20.     return true;
  21. }
  22. // if the tree is empty, return true if the subtree template is too. 
  23. if ( t==null ) {
  24.     if ( sub!=null ) return false;
  25.     return true;
  26. }
  27. // Otherwise, start walking sibling lists.  First mismatch, return false.
  28. for (sibling=t;
  29.      sibling!=null&&sub!=null;
  30.      sibling=sibling.getNextSibling(), sub=sub.getNextSibling())
  31.     {
  32. // as a quick optimization, check roots first.
  33. if ( sibling.getType() != sub.getType() ) return false;
  34. // if roots match, do full match test on children.
  35. if ( sibling.getFirstChild()!=null ) {
  36.     if ( !isSubtree(sibling.getFirstChild(), sub.getFirstChild()) ) return false;
  37. }
  38.     }
  39. return true;
  40.     }
  41.     /** Find the next subtree with structure and token types equal to
  42.  * those of 'template'.
  43.  */
  44.     public AST next(AST template) {
  45. AST t = null;
  46. AST sibling = null;
  47. if ( cursor==null ) { // do nothing if no tree to work on
  48.     return null;
  49. }
  50. // Start walking sibling list looking for subtree matches.
  51. for ( ; cursor!=null; cursor=cursor.getNextSibling())
  52.     {
  53. // as a quick optimization, check roots first.
  54. if ( cursor.getType() == template.getType() ) {
  55. // if roots match, do full match test on children.
  56.     if ( cursor.getFirstChild()!=null ) {
  57. if ( isSubtree(cursor.getFirstChild(), template.getFirstChild()) ) {
  58.     return cursor;
  59. }
  60.     }
  61. }
  62.     }
  63. return t;
  64.     }
  65. }