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

编译器/解释器

开发平台:

Others

  1. (* 
  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/lib/sather/Antlr/ast_util.sa#1 $
  7. *)
  8. class ANTLR_AST_UTIL{AST < $ANTLR_AST{AST}} is
  9.    -- Duplicate tree including siblings of root. 
  10.    dup_list( t : AST ) : AST is
  11.       res : AST := dup_tree(t);  -- if void(t), then void(result)
  12.       nt : AST := res;
  13.       loop while! ( ~void(t) ); -- for each sibling of the root
  14.  t := t.next_sibling;
  15.  nt.next_sibling( dup_tree(t) ); -- dup each subtree, building new tree
  16.  nt := nt.next_sibling;
  17.       end;
  18.       return res;
  19.    end;
  20.    
  21.    -- Duplicate a tree, assuming this is a root node of a tree --n
  22.    -- duplicate that node and what's below; ignore siblings of root node.
  23.    dup_tree( t : AST ) : AST is
  24.       res : AST := t.dup;  -- make copy of root
  25.       -- copy all children of root.
  26.       if ( ~void(t) ) then
  27.  res.first_child( dup_list( t.first_child ) );
  28.       end;
  29.       return res;
  30.    end;
  31.    -- Make a tree from a list of nodes.  The first element in the
  32.    -- array is the root.  If the root is null, then the tree is
  33.    -- a simple list not a tree.  Handles null children nodes correctly.
  34.    -- For example, build(a, b, void, c) yields tree (a b c).  build(void,a,b)
  35.    --  yields tree (nil a b).
  36.    make( nodes : $ARR{AST} ) : AST is
  37.       if ( void(nodes) or nodes.size = 0 ) then
  38.  return void;
  39.       end;
  40.       root : AST := nodes[0];
  41.       tail : AST;
  42.       if ( ~void(root) ) then
  43.  root.first_child(void); -- don't leave any old pointers set
  44.       end;
  45.       -- link in children;
  46.       ni : AST;
  47.       i : INT;
  48.       loop i := 1.upto!( nodes.size - 1);
  49.  ni := nodes[i];
  50.  -- ni := nodes.elt!; -- can't use elt! since it starts from index 0
  51.  if ( ~void(ni) ) then -- ignore null nodes
  52.     if ( void(root) ) then
  53.        -- Set the root and set it up for a flat list
  54.        tail := ni;
  55.        root := tail;
  56.     elsif ( void(tail) ) then
  57.        root.first_child(ni);
  58.        tail := root.first_child;
  59.     else 
  60.        tail.next_sibling(ni);
  61.        tail := tail.next_sibling;
  62.     end;
  63.     -- Chase tail to last sibling
  64.     loop while! ( ~void(tail.next_sibling) ); 
  65.        tail := tail.next_sibling;
  66.     end;
  67.  end;
  68.       end;
  69.       return root;
  70.    end;
  71. end;