#!perl
use
5.010001;
use
POSIX
qw(setlocale LC_ALL)
;
POSIX::setlocale(LC_ALL,
"C"
);
my
$base_dsl
=
<<'END_OF_BASE_DSL';
:start ::= S
A ::= 'a' | E
E ::= # empty
END_OF_BASE_DSL
sub
ah_extended {
my
$n
=
shift
;
my
$full_dsl
=
$base_dsl
.
join
q{ }
,
'S'
,
'::='
, ( (
'A'
) x
$n
);
my
$grammar
= Marpa::R3::Scanless::G->new( {
source
=> \
$full_dsl
, } );
my
$input
=
'a'
x
$n
;
my
$recce
= Marpa::R3::Scanless::R->new( {
grammar
=>
$grammar
} );
$recce
->
read
( \
$input
);
my
@parse_counts
= (1);
for
my
$loc
( 1 ..
$n
) {
my
$parse_number
= 0;
$recce
->series_restart( {
end
=>
$loc
} );
my
$asf
= Marpa::R3::ASF->new( {
slr
=>
$recce
,
factoring_max
=> 1000} );
$parse_counts
[
$loc
] =
$asf
->traverse(
{},
sub
{
my
(
$glade
) =
@_
;
my
$glade_count
= 0;
do
{
my
$rule_count
= 1;
if
(
defined
$glade
->rule_id() ) {
$rule_count
*=
$glade
->rh_value(
$_
)
for
0 ..
$glade
->rh_length() - 1;
}
$glade_count
+=
$rule_count
;
$glade
->literal();
}
while
defined
$glade
->
next
();
return
$glade_count
;
}
);
}
return
join
q{ }
,
@parse_counts
;
}
my
@answers
= (
undef
,
'1 1'
,
'1 2 1'
,
'1 3 3 1'
,
'1 4 6 4 1'
,
'1 5 10 10 5 1'
,
'1 6 15 20 15 6 1'
,
'1 7 21 35 35 21 7 1'
,
'1 8 28 56 70 56 28 8 1'
,
'1 9 36 84 126 126 84 36 9 1'
,
'1 10 45 120 210 252 210 120 45 10 1'
,
);
for
my
$a
( ( 1 .. 5 ), 10 ) {
Marpa::R3::Test::is( ah_extended(
$a
),
$answers
[
$a
],
"Row $a of Pascal's triangle matches parse counts"
);
}
1;