#!perl
use
5.010001;
use
POSIX
qw(setlocale LC_ALL)
;
POSIX::setlocale(LC_ALL,
"C"
);
sub
do_A {
my
(
$self
,
$values
) =
@_
;
my
(
$letter
) = @{
$values
};
return
join
';'
,
"class method"
,
"letter=$letter"
;
}
sub
do_A {
my
(
$self
,
$values
) =
@_
;
my
(
$letter
) = @{
$values
};
return
join
';'
,
"package method"
,
"letter=$letter"
;
}
my
@tests
= ();
PPO:
for
my
$ppo_desc
(
'no'
,
'unblessed'
,
'same blessed'
,
'other blessed'
) {
my
$package_arg
= {
semantics_package
=>
'Package_Actions'
};
my
$method_desc
=
'package method'
;
my
$ppo
=
undef
;
SET_PPO_PARMS: {
last
SET_PPO_PARMS
if
$ppo_desc
eq
'no'
;
if
(
$ppo_desc
eq
'unblessed'
) {
$ppo
= {
desc
=>
$ppo_desc
};
last
SET_PPO_PARMS;
}
if
(
$ppo_desc
eq
'same blessed'
) {
$ppo
=
bless
{
desc
=>
$ppo_desc
},
'Package_Actions'
;
$method_desc
=
'package method'
if
not
defined
$method_desc
;
last
SET_PPO_PARMS;
}
if
(
$ppo_desc
eq
'other blessed'
) {
$ppo
=
bless
{
desc
=>
$ppo_desc
},
'Class_Actions'
;
$method_desc
=
'class method'
if
not
defined
$method_desc
;
last
SET_PPO_PARMS;
}
die
;
}
next
PPO
if
not
defined
$method_desc
;
my
$value
=
join
';'
,
$method_desc
,
'letter=a'
;
my
$desc
=
"$ppo_desc ppo"
;
push
@tests
, [
$package_arg
,
$ppo
,
$value
,
'Parse OK'
,
$desc
];
}
TEST:
for
my
$test_data
(
@tests
) {
my
(
$package_arg
,
$ppo
,
$expected_value
,
$expected_result
,
$test_name
)
= @{
$test_data
};
my
(
$actual_value
,
$actual_result
) =
my_parser(
$package_arg
,
$ppo
);
Test::More::is(
Data::Dumper::Dumper( \
$actual_value
),
Data::Dumper::Dumper( \
$expected_value
),
qq{Value of $test_name}
);
Test::More::is(
$actual_result
,
$expected_result
,
qq{Result of $test_name}
);
}
sub
my_parser {
my
(
$package_arg
,
$ppo
) =
@_
;
my
$grammar
=
Marpa::R3::Scanless::G->new( {
source
=> \
q(A ::= 'a' action => do_A)
, },
$package_arg
);
my
$recce
= Marpa::R3::Scanless::R->new( {
grammar
=>
$grammar
} );
if
( not
defined
eval
{
$recce
->
read
( \
'a'
); 1 } ) {
my
$abbreviated_error
=
$EVAL_ERROR
;
chomp
$abbreviated_error
;
return
'No parse'
,
$abbreviated_error
;
}
my
$value_ref
;
if
( not
defined
eval
{
$value_ref
=
$recce
->value(
$ppo
); 1 } ) {
my
$abbreviated_error
=
$EVAL_ERROR
;
chomp
$abbreviated_error
;
return
'value() failure'
,
$abbreviated_error
;
}
if
( not
defined
$value_ref
) {
return
'No parse'
,
'Input read to end but no parse'
;
}
return
${
$value_ref
},
'Parse OK'
;
}