#!perl
use
5.010001;
use
POSIX
qw(setlocale LC_ALL)
;
POSIX::setlocale(LC_ALL,
"C"
);
sub
My_Actions::minus {
my
(
undef
,
$values
) =
@_
;
my
(
$right_string
,
$right_value
) = (
$values
->[2] =~ /^(.*)==(.*)$/xms );
my
(
$left_string
,
$left_value
) = (
$values
->[0] =~ /^(.*)==(.*)$/xms );
my
$value
=
$left_value
-
$right_value
;
return
'('
.
$left_string
.
q{-}
.
$right_string
.
')=='
.
$value
;
}
sub
My_Actions::postfix_decr {
my
(
undef
,
$values
) =
@_
;
my
(
$string
,
$value
) = (
$values
->[0] =~ /^(.*)==(.*)$/xms );
return
'('
.
$string
.
q{--}
.
')=='
.
$value
--;
}
sub
My_Actions::prefix_decr {
my
(
undef
,
$values
) =
@_
;
my
(
$string
,
$value
) = (
$values
->[2] =~ /^(.*)==(.*)$/xms );
return
'('
.
q{--}
.
$string
.
')=='
. --
$value
;
}
sub
My_Actions::negation {
my
(
undef
,
$values
) =
@_
;
my
(
$string
,
$value
) = (
$values
->[1] =~ /^(.*)==(.*)$/xms );
return
'('
.
q{-}
.
$string
.
')=='
. -
$value
;
}
sub
My_Actions::number {
my
(
undef
,
$values
) =
@_
;
return
$values
->[0] .
q{==}
.
$values
->[0];
}
sub
My_Actions::default_action {
my
(
undef
,
$values
) =
@_
;
my
$v_count
=
scalar
@_
;
return
q{}
if
$v_count
<= 0;
return
$values
->[0]
if
$v_count
== 1;
return
'('
.
join
(
q{;}
, @{
$values
} ) .
')'
;
}
my
$g
= Marpa::R3::Scanless::G->new(
{
semantics_package
=>
'My_Actions'
,
source
=> \(
<<'END_OF_SOURCE'),
:start ::= E
:default ::= action => default_action
E ::=
E Minus E action => minus
| E Minus Minus action => postfix_decr
| Minus Minus E action => prefix_decr
| Minus E action => negation
| Number action => number
Number ~ [0-9]
Minus ~ '-'
END_OF_SOURCE
}
);
my
@expected
=
qw(0 1 1 3 4 8 12 21 33 55 88 144 232 )
;
for
my
$n
( 1 .. 12 ) {
my
$recce
= Marpa::R3::Scanless::R->new(
{
grammar
=>
$g
,
max_parses
=> 300
}
);
$recce
->
read
( \
'6-'
, 0, 1 );
$recce
->resume( 1, 1 )
for
1 ..
$n
;
$recce
->resume( 0, 1 );
my
$parse_count
= 0;
while
(
$recce
->value() ) {
$parse_count
++; }
Marpa::R3::Test::is(
$expected
[
$n
],
$parse_count
,
"Wall Series Number $n"
);
}
1;