#!perl
use
5.010001;
use
Fatal
qw(open close)
;
use
POSIX
qw(setlocale LC_ALL)
;
POSIX::setlocale(LC_ALL,
"C"
);
open
my
$original_stdout
,
q{>&STDOUT}
;
sub
save_stdout {
my
$save
;
my
$save_ref
= \
$save
;
close
STDOUT;
open
STDOUT,
q{>}
,
$save_ref
;
return
$save_ref
;
}
sub
restore_stdout {
close
STDOUT;
open
STDOUT,
q{>&}
,
$original_stdout
;
return
1;
}
sub
do_L {
my
(
undef
,
$values
) =
@_
;
return
'L('
. (
join
q{;}
,
map
{
$_
//
'[ERROR!]'
} @{
$values
} ) .
')'
;
}
sub
do_R {
return
'R(): I will never be called'
;
}
sub
do_S {
my
(
undef
,
$values
) =
@_
;
return
'S('
. (
join
q{;}
,
map
{
$_
//
'[ERROR!]'
} @{
$values
} ) .
')'
;
}
sub
do_X {
return
'X('
.
$_
[1]->[0] .
')'
; }
sub
do_Y {
return
'Y('
.
$_
[1]->[0] .
')'
; }
our
$null_A
=
'null A'
;
our
$null_B
=
'null B'
;
our
$null_L
=
'null L'
;
our
$null_R
=
'null R'
;
our
$null_X
=
'null X'
;
our
$null_Y
=
'null Y'
;
my
$slg
= Marpa::R3::Scanless::G->new(
{
source
=> \
<<'END_OF_DSL',
:start ::= S
S ::= L R action => do_S
L ::= A B X action => do_L
L ::= action => null_L
R ::= A B Y action => do_R
R ::= action => null_R
A ::= action => null_A
B ::= action => null_B
X ::= action => null_X
X ::= 'x' action => do_X
Y ::= action => null_Y
Y ::= 'y' action => do_Y
END_OF_DSL
}
);
my
$slr
= Marpa::R3::Scanless::R->new(
{
grammar
=>
$slg
,
semantics_package
=>
'main'
,
}
);
$slr
->
read
( \
'x'
);
chomp
(
my
$expected
=
<<'END_OF_OUTPUT');
S(L(null A;null B;X(x));null R)
END_OF_OUTPUT
my
$value
=
$slr
->value();
Marpa::R3::Test::is( ${
$value
},
$expected
,
'Null example'
);