Parse-FSM
view release on metacpan or search on metacpan
t/FSM-parser.t view on Meta::CPAN
#------------------------------------------------------------------------------
# start : [num]<+,> EOF
# num : NUM
t_grammar(
[ ["start", "[num]<+,>", '', '{$item[0]}'],
["num", "NUM", '{$item[0][1]}'] ],
undef,
<<'END');
start : num <+,> '' {$item[0]} ;
num : 'NUM' {$item[0][1]} ;
END
$parser->input(make_lexer(""));
eval {$parser->parse};
is $@, "Expected NUM at EOF\n";
is $parser->get_token, undef;
$parser->input(make_lexer("10"));
is_deeply $parser->parse, [10];
is $parser->get_token, undef;
$parser->input(make_lexer("10 11"));
eval {$parser->parse};
is $@, "Expected EOF at NUM\n";
is_deeply $parser->get_token, [NUM => 11];
is $parser->get_token, undef;
$parser->input(make_lexer("10,"));
eval {$parser->parse};
is $@, "Expected NUM at EOF\n";
is $parser->get_token, undef;
$parser->input(make_lexer("10,11"));
is_deeply $parser->parse, [10, 11];
is $parser->get_token, undef;
$parser->input(make_lexer("10, 11, 12"));
is_deeply $parser->parse, [10, 11, 12];
is $parser->get_token, undef;
$parser->input(make_lexer("a"));
eval {$parser->parse};
is $@, "Expected NUM at NAME\n";
is_deeply $parser->get_token, [NAME => "a"];
is $parser->get_token, undef;
$parser->input(make_lexer("10 a"));
eval {$parser->parse};
is $@, "Expected EOF at NAME\n";
is_deeply $parser->get_token, [NAME => "a"];
is $parser->get_token, undef;
#------------------------------------------------------------------------------
done_testing;
#------------------------------------------------------------------------------
sub t_grammar {
my($rules, $start_rule, $grammar) = @_;
my $test = "[line ".(caller)[2]."]";
# build with add_rule
$fsm = new_ok('Parse::FSM');
for my $rule (@$rules) {
$fsm->add_rule(@$rule);
}
defined($start_rule) and $fsm->start_rule($start_rule);
isa_ok $parser = $fsm->parser, 'Parse::FSM::Driver';
# build with parse_grammar
my $fsm2 = new_ok('Parse::FSM');
$fsm2->parse_grammar($grammar);
isa_ok my $parser2 = $fsm2->parser, 'Parse::FSM::Driver';
# test that they are equivalent
is_deeply $fsm, $fsm2, $test;
}
( run in 1.743 second using v1.01-cache-2.11-cpan-302cb4679cc )