10 my ($src, $dst) = /(\w+) => (\w+)/;
11 # push @rules, [$src, $dst];
12 push @{ $rules{$src} }, [ split(/(?=[A-Z])/, $dst) ];
16 my @mol = split(/(?=[A-Z])/, $mol);
22 for my $elem (keys %rules) {
23 for my $rule (@{ $rules{$elem} }) {
25 my @q = ([ ['e'], \@mol, 0 ]);
31 my ($stack, $mol, $steps) = @$entry;
33 if (!@$stack && !@$mol) {
37 if (!@$stack || !@$mol) {
40 say "apply $steps: @$stack => @$mol";
42 if ($stack->[0] eq $mol->[0]) {
43 say "reduce $stack->[0]";
48 unshift @q, [ \@nstack, \@nmol, $steps ];
50 for my $rule (@{ $rules{$stack->[0]} }) {
53 unshift @nstack, @$rule;
54 my $key = join(' ', @nstack, '=', @$mol);
55 next if $seen{$key}++;
56 say "push $stack->[0] => @$rule";
57 push @q, [ \@nstack, [ @$mol ], $steps+1 ];