# A point of view on the direct children of the node
fun children: SequenceRead[nullable Node] is abstract
+ # A point of view of a depth-first visit of all non-null children
+ var depth: Collection[Node] = new DephCollection(self)
+
# Visit all the children of the node with the visitor `v`
protected fun visit_children(v: Visitor)
do
end
end
+private class DephCollection
+ super NaiveCollection[Node]
+ var node: Node
+ redef fun iterator do return new DephIterator([node].iterator)
+end
+
+private class DephIterator
+ super Iterator[Node]
+ var stack = new List[Iterator[nullable Node]]
+
+ init(i: Iterator[nullable Node])
+ do
+ stack.add i
+ end
+
+ redef fun is_ok do return not stack.is_empty
+ redef fun item do return stack.last.item.as(not null)
+ redef fun next
+ do
+ var i = stack.last
+ stack.push i.item.children.iterator
+ i.next
+ while is_ok do
+ if not stack.last.is_ok then
+ stack.pop
+ continue
+ end
+ if stack.last.item == null then
+ stack.last.next
+ continue
+ end
+ return
+ end
+ end
+end
+
# A token produced by the lexer and used in a syntactic tree
abstract class NToken
super Node
tpv.enter_visit(n)
n = n.error_tree
else
- print "ROOT: {n} (see {astout} and {astdotout})"
+ print "ROOT: {n}; {n.depth.length} nodes (see {astout} and {astdotout})"
end
tpv.enter_visit(n)
n.to_dot(astdotout)