#!perl
use
5.010001;
sub
main::default_action {
my
(
undef
,
$values
) =
@_
;
return
(
join
q{}
,
grep
{
defined
} @{
$values
} );
}
my
$dsl
=
<<'END_OF_DSL';
:default ::= action => main::default_action
S ::= a S
S ::=
a ~ 'a'
END_OF_DSL
my
$grammar
= Marpa::R3::Scanless::G->new( {
source
=> \
$dsl
} );
Marpa::R3::Test::is(
$grammar
->show_symbols(),
<<'END_OF_STRING', 'Leo166 Symbols' );
G1 S0 S
G1 S1 [:start]
G1 S2 a
END_OF_STRING
Marpa::R3::Test::is(
$grammar
->show_rules,
<<'END_OF_STRING', 'Leo166 Rules' );
G1 R0 S ::= a S
G1 R1 S ::=
G1 R2 [:start] ::= S
END_OF_STRING
Marpa::R3::Test::is(
$grammar
->show_ahms,
<<'END_OF_STRING', 'Leo166 AHMs' );
AHM 0: postdot = "a"
S ::= . a S
AHM 1: postdot = "S"
S ::= a . S
AHM 2: completion
S ::= a S .
AHM 3: postdot = "a"
S ::= . a S[]
AHM 4: completion
S ::= a S[] .
AHM 5: postdot = "S"
[:start] ::= . S
AHM 6: completion
[:start] ::= S .
AHM 7: postdot = "[:start]"
[:start]['] ::= . [:start]
AHM 8: completion
[:start]['] ::= [:start] .
END_OF_STRING
my
$length
= 50;
my
$input
=
'a'
x
$length
;
my
$recce
= Marpa::R3::Scanless::R->new( {
grammar
=>
$grammar
} );
$recce
->
read
( \
$input
, 0, 0 );
my
$g1_pos
=
$recce
->g1_pos();
my
$max_size
=
$recce
->earley_set_size(
$g1_pos
);
TOKEN:
for
(
my
$i
= 0;
$i
<
$length
;
$i
++ ) {
$recce
->lexeme_read(
'a'
,
undef
, 1, (
substr
$input
,
$i
, 1) );
$g1_pos
=
$recce
->g1_pos();
my
$size
=
$recce
->earley_set_size(
$g1_pos
);
$max_size
=
$size
>
$max_size
?
$size
:
$max_size
;
}
my
$expected_size
= 7;
Marpa::R3::Test::is(
$max_size
,
$expected_size
,
"Leo test of earley set size"
);
my
$value_ref
=
$recce
->value();
my
$value
=
$value_ref
? ${
$value_ref
} :
'No parse'
;
Marpa::R3::Test::is(
$value
,
'a'
x
$length
,
'Leo p166 parse'
);