action article target "\n"
action ::= "WALK" | "FEED" | "PLAY WITH"
target ::= "DOG" | "CAT" | "CANARY" | "FISH"
article ::= "A" | "THE"
####
WALK THE DOG
FEED THE CANARY
PLAY WITH A FISH
####
use strict;
use warnings;
while (my $sLine = ) {
my @aFields = split(/\s+/, $sLine);
#the general case
my $sAction = shift @aFields;
my $sArticle = shift @aFields;
my $sTarget = shift @aFields;
#special cases - PLAY WITH has two tokens
if ($sAction eq 'PLAY') {
$sAction .= " $sArticle"; #$sArticle is 'WITH'
$sArticle = $sTarget; #$sTarget is an article
$sTarget = shift @aFields; #target never got read
}
doSomethingWithStatement($sAction, $sArticle, $sTarget);
}
sub doSomethingWithStatement {
my ($sAction, $sArticle, $sTarget) = @_;
print "action=<$sAction> article=<$sArticle> target=<$sTarget>\n";
}
__DATA__
WALK THE DOG
FEED THE FISH
PLAY WITH A CANARY