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 )