use warnings; use strict; $^W++; # for some reason use warnings doesn't cut it use Test::More; eval "use Test::Warn"; plan skip_all => "Test::Warn required for testing reentry" if $@; use Parse::RecDescent; my $g1 = <<'EOG'; { use warnings; use strict; my @seq; } genome : base(s) { $return = \@seq } base : A | C | G | T A : /a/ { push @seq, $item[0] } C : /c/ { push @seq, $item[0] } G : /g/ { push @seq, $item[0] } T : /t/ { push @seq, $item[0] } EOG my $g2 = <<'EOG'; { use warnings; use strict; my @seq; } genome : ( A | C | G | T )(s) { $return = \@seq } A : /a/ { push @seq, $item[0] } C : /c/ { push @seq, $item[0] } G : /g/ { push @seq, $item[0] } T : /t/ { push @seq, $item[0] } EOG my @sequences = (qw/aatgcttgc cctggattcg ctggaagtc ctgXc/); plan tests => @sequences * 4; for my $to_sequence (@sequences) { my ($p1, $p2); warnings_are (sub { $p1 = Parse::RecDescent->new ($g1); }, [], 'no warnings emitted during grammar1 parsing'); warnings_are (sub { $p2 = Parse::RecDescent->new ($g2); }, [], 'no warnings emitted during grammar2 parsing'); warnings_are (sub { is_deeply ( $p1->genome ($to_sequence), $p2->genome ($to_sequence), 'grammars produce same result' ); }, [], 'no warnings emitted during grammar execution'); }