ast_pair.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_pair.sa#1 $
  7. *)
  8. -- ANTLR_AST_PAIR:  utility class used for manipulating a pair of ASTs
  9. -- representing the current AST root and current AST sibling.
  10. class ANTLR_AST_PAIR{AST < $ANTLR_AST{AST}} is
  11.    attr root : AST;    -- current root of tree
  12.    attr child : AST;   -- current child to which siblings are added
  13.    create : SAME is
  14.       res : SAME := new;
  15.       return res;
  16.    end;
  17.    -- Make sure that child is the last sibling
  18.    advance_child_to_end is
  19.       if ( ~void(child) ) then
  20.  loop while! ( ~void( child.next_sibling ) );
  21.     child := child.next_sibling;
  22.  end;
  23.       end;
  24.    end;
  25.    
  26.    -- Copy an ANTLR_AST_PAIR
  27.    copy : ANTLR_AST_PAIR{AST} is 
  28.       tmp : ANTLR_AST_PAIR{AST} := new;
  29.       tmp.root := root;
  30.       tmp.child := child;
  31.       return tmp;
  32.    end;
  33.    
  34.    str : STR is
  35.       r, c : STR;
  36.       
  37.       if ( void(root) ) then
  38.  r := "null"; 
  39.       else 
  40.  r := root.text;
  41.       end;
  42.       if ( void(child) ) then
  43.  c := "null"; 
  44.       else 
  45.  c := child.text;
  46.       end;
  47.       return "[" + r + "," + c + "]";
  48.    end;
  49.    -- Add a child to the self
  50.    add_child( ch : AST ) is
  51.       if ( ~void(ch) ) then
  52.  if ( void(root) ) then
  53.     -- Make new child the current root
  54.     root := ch;
  55.  else
  56.     if ( void(child) ) then
  57.        -- Add new child to current root
  58.        root.first_child := ch;
  59.     else
  60.        child.next_sibling := ch;
  61.     end;
  62.  end;
  63.  -- Make new child the current child
  64.  child := ch;
  65.  advance_child_to_end;
  66.       end;
  67.    end;
  68.    
  69.    -- Make an AST the root of self
  70.    make_root( rt : AST ) is
  71.       if ( ~void(rt) ) then
  72.  -- Add the current root as a child of new root
  73.  rt.add_child(root);
  74.  -- The new current child is the last sibling of the old root
  75.  child := root;
  76.  advance_child_to_end;
  77.  -- Set the new root
  78.  root := rt;
  79.       end;
  80.    end;
  81.  
  82. end;