#!perl
use
5.010001;
use
POSIX
qw(setlocale LC_ALL)
;
POSIX::setlocale(LC_ALL,
"C"
);
sub
main::default_action {
return
(
join
q{}
,
grep
{
defined
} @{
$_
[1]} );
}
my
$grammar
= Marpa::R3::Grammar->new(
{
source
=> \(
<<'END_OF_DSL'),
:default ::= action => main::default_action
:start ::= S
S ::= a A
A ::= B
B ::= C
C ::= S
S ::=
a ~ 'a'
END_OF_DSL
}
);
Marpa::R3::Test::is(
$grammar
->symbols_show(),
<<'END_OF_STRING', 'Leo166 Symbols' );
S1 A
S2 B
S3 C
S4 S
S5 [:lex_start:]
S6 [:start:]
S7 [a]
S8 a
END_OF_STRING
Marpa::R3::Test::is(
$grammar
->productions_show,
<<'END_OF_STRING', 'Leo166 Productions' );
R1 [:start:] ::= S
R2 S ::= a A
R3 A ::= B
R4 B ::= C
R5 C ::= S
R6 S ::=
R7 [:lex_start:] ~ a
R8 a ~ [a]
END_OF_STRING
Marpa::R3::Test::is(
$grammar
->ahms_show(),
<<'END_OF_STRING', 'Leo166 AHMs' );
AHM 0: dot=0; nulls=0
S ::= . a A
AHM 1: dot=1; nulls=0
S ::= a . A
AHM 2: completion; dot=2; nulls=0
S ::= a A .
AHM 3: dot=0; nulls=0
S ::= . a A[]
AHM 4: completion; dot=2; nulls=1
S ::= a A[] .
AHM 5: dot=0; nulls=0
A ::= . B
AHM 6: completion; dot=1; nulls=0
A ::= B .
AHM 7: dot=0; nulls=0
B ::= . C
AHM 8: completion; dot=1; nulls=0
B ::= C .
AHM 9: dot=0; nulls=0
C ::= . S
AHM 10: completion; dot=1; nulls=0
C ::= S .
AHM 11: dot=0; nulls=0
[:start:] ::= . S
AHM 12: completion; dot=1; nulls=0
[:start:] ::= S .
AHM 13: dot=0; nulls=0
[:start:]['] ::= . [:start:]
AHM 14: completion; dot=1; nulls=0
[:start:]['] ::= [:start:] .
END_OF_STRING
my
$length
= 20;
my
$recce
= Marpa::R3::Recognizer->new(
{
grammar
=>
$grammar
} );
my
$i
= 0;
my
$g1_pos
=
$recce
->g1_pos();
my
$max_size
=
$recce
->earley_set_size(
$g1_pos
);
$recce
->
read
( \(
'a'
x
$length
) );
TOKEN:
for
(
my
$i
= 0;
$i
<
$length
;
$i
++ ) {
my
$size
=
$recce
->earley_set_size(
$i
);
$max_size
=
$size
>
$max_size
?
$size
:
$max_size
;
}
my
$expected_size
= 10;
Marpa::R3::Test::is(
$max_size
,
$expected_size
,
"Earley set size, got $max_size, expected $expected_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'
);