11 delete $seqn2node{$x->{seqn}};
12 my $size = 0; $size += $_ for values %{$x->{leaves}};
13 $x->{self_size} = $size;
14 if (my $parent = $stack[-1]) {
16 $x->{parent_seqn} = $parent->{seqn};
17 # accumulate into parent
18 $parent->{kids_node_count} += 1 + ($x->{kids_node_count}||0);
19 $parent->{kids_size} += $size + $x->{kids_size};
20 push @{$parent->{child_seqn}}, $x->{seqn};
29 my ($type, $seqn, $val, $name, $extra) = split / /, $_, 5;
30 if ($type eq "N") { # Node ($val is depth)
31 while ($val < @stack) {
33 warn "N $seqn d$val ends $x->{seqn} d$x->{depth}: size $x->{self_size}+$x->{kids_size}\n";
35 die 1 if $stack[$val];
36 my $node = $stack[$val] = { seqn => $seqn, name => $name, extra => $extra, attr => [], leaves => {}, depth => $val, self_size=>0, kids_size=>0 };
37 $seqn2node{$seqn} = $node;
39 elsif ($type eq "L") { # Leaf name and memory size
40 my $node = $seqn2node{$seqn} || die;
41 $node->{leaves}{$name} += $val;
43 elsif ($type eq "A") { # Attribute name and value
44 my $node = $seqn2node{$seqn} || die;
45 push @{ $node->{attr} }, $name, $val; # pairs
48 warn "Invalid type '$type' on line $. ($_)";
54 $x = pop_stack() while @stack;
55 warn "EOF ends $x->{seqn} d$x->{depth}: size $x->{self_size}+$x->{kids_size}\n";
59 warn Dumper(\%seqn2node);
62 SV(PVAV) fill=1/1 [#1 @0]
69 : : : : SV(PVAV) fill=-1/-1 [#5 @4]
77 N 1 0 SV(PVAV) fill=1/1
84 N 5 4 SV(PVAV) fill=-1/-1