Cover V11, I05

Article
Listing 1
Listing 2
Listing 3
Listing 4
Listing 5

may2002.tar

Listing 2 grammtest.pl

#! /usr/local/bin/perl -sw
#
use strict;
use Parse::RecDescent;
#
my $rval = 0;
my $grammar =
q{
    Command    :nooptcmd EndOfString
            { $return = $item[1]; }
            { print "item0=$item[0] item1=$item[1]\n"; }
             |    oneoptcmd anoption EndOfString
            { $return = "$item[1] $item[2]"; }
            { print "item0=$item[0] item1=$item[1] item2=$item[2]\n"; }
        |    twooptcmd anoption anoption EndOfString
            { $return = "$item[1] $item[2] $item[3]"; }
            { print "item0=$item[0] item1=$item[1] item2=$item[2] item3=$item[3]\n"; }
             |    <error>

    oneoptcmd    :    'script1'

    twooptcmd    :    'script2' | 'script1'

    nooptcmd    :    'script3'

    anoption    :    /[A-Za-z0-9\-\_\*\.]+/

    EndOfString :    /\Z/
};

my $parse = new Parse::RecDescent ($grammar);

print "> ";
while (<>)
{
    $rval = $parse->Command($_);
    if (defined $rval) { print "$rval\n"; }
    print "> ";
}