use strict; use Parse::RecDescent; $::RD_ERRORS = 1; # kill parser if it encounters an error $::RD_WARN = 1; # enable warnings $::RD_HINT = 1; # helpful hints my $grammar = << 'GRAMMAR'; seq: start codon(s) stop /^\Z/ start: met stop: amber | ochre | opal codon: leu | phe | cys | trp | tyr | val | met | gly | ala | glu | asp | pro | arg | lys | his | gln | ser | thr | ile | asn lys: A A pur { print "$item[0] " } asn: A A pyr { print "$item[0] " } ile: A U pyr { print "$item[0] " } thr: A C base { print "$item[0] " } met: A U G { print "$item[0] " } ser: A G pyr { print "$item[0] " } gln: C A pur { print "$item[0] " } his: C A pyr { print "$item[0] " } arg: C G base | A G pur { print "$item[0] " } pro: C C base { print "$item[0] " } asp: G A pyr { print "$item[0] " } glu: G A pur { print "$item[0] " } ala: G C base { print "$item[0] " } gly: G G base { print "$item[0] " } val: G U base { print "$item[0] " } tyr: U A pyr { print "$item[0] " } trp: U G G { print "$item[0] " } cys: U G pyr { print "$item[0] " } phe: U U pyr { print "$item[0] " } leu: U U pur | C U base { print "$item[0] " } amber: U A G { print "$item[0] " } ochre: U A A { print "$item[0] " } opal: U G A { print "$item[0] " } base: pyr | pur pyr: U | C pur: G | A U: /U/i A: /A/i G: /G/i C: /C/i GRAMMAR my $p = new Parse::RecDescent( $grammar ) or die "Compile error\n"; while ( ) { print; chomp; unless ( defined $p->seq( $_ ) ) { print "\nOoops\n"; } } __DATA__ AUG AAA GGC AGA AAG UAA