📄 ast_util.sa
字号:
(*
ANTLR Translator Generator
Project led by Terence Parr at http://www.jGuru.com
Software rights: http://www.antlr.org/RIGHTS.html
$Id: ast_util.sa,v 1.1.1.1 2002/01/02 19:59:09 agno Exp $
*)
class ANTLR_AST_UTIL{AST < $ANTLR_AST{AST}} is
-- Duplicate tree including siblings of root.
dup_list( t : AST ) : AST is
res : AST := dup_tree(t); -- if void(t), then void(result)
nt : AST := res;
loop while! ( ~void(t) ); -- for each sibling of the root
t := t.next_sibling;
nt.next_sibling( dup_tree(t) ); -- dup each subtree, building new tree
nt := nt.next_sibling;
end;
return res;
end;
-- Duplicate a tree, assuming this is a root node of a tree --n
-- duplicate that node and what's below; ignore siblings of root node.
dup_tree( t : AST ) : AST is
res : AST := t.dup; -- make copy of root
-- copy all children of root.
if ( ~void(t) ) then
res.first_child( dup_list( t.first_child ) );
end;
return res;
end;
-- Make a tree from a list of nodes. The first element in the
-- array is the root. If the root is null, then the tree is
-- a simple list not a tree. Handles null children nodes correctly.
-- For example, build(a, b, void, c) yields tree (a b c). build(void,a,b)
-- yields tree (nil a b).
make( nodes : $ARR{AST} ) : AST is
if ( void(nodes) or nodes.size = 0 ) then
return void;
end;
root : AST := nodes[0];
tail : AST;
if ( ~void(root) ) then
root.first_child(void); -- don't leave any old pointers set
end;
-- link in children;
ni : AST;
i : INT;
loop i := 1.upto!( nodes.size - 1);
ni := nodes[i];
-- ni := nodes.elt!; -- can't use elt! since it starts from index 0
if ( ~void(ni) ) then -- ignore null nodes
if ( void(root) ) then
-- Set the root and set it up for a flat list
tail := ni;
root := tail;
elsif ( void(tail) ) then
root.first_child(ni);
tail := root.first_child;
else
tail.next_sibling(ni);
tail := tail.next_sibling;
end;
-- Chase tail to last sibling
loop while! ( ~void(tail.next_sibling) );
tail := tail.next_sibling;
end;
end;
end;
return root;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -