ディレクティブ leftop のリスト表現で空リストを扱う

#!/usr/bin/env perl

use strict;
use Parse::RecDescent;
use Data::Dumper;

my $grammar =
q{
    inputs    : list
                  { print Data::Dumper::Dumper($item[1]); }
    list      : '(' <leftop: list_item /(,|=>)/ list_item>(?) ')'
                  { $return = $item[2] }
    list_item : /\w/
};

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

while (<>)
{
    defined $parse->inputs($_) or print "Bad text!\n";
}

で、

Bad text!
()
$VAR1 = [];
( a=>1, b=>2 )
Bad text!
( a=>1 )
Bad text!

うーん、「(?)」なしのルールと or しろということなのかな?

#!/usr/bin/env perl

use strict;
use Parse::RecDescent;
use Data::Dumper;

my $grammar =
q{
    inputs    : list
                  { print Data::Dumper::Dumper($item[1]); }
    list      : '(' <leftop: list_item /(,|=>)/ list_item> ')'
                  { $return = $item[2] }
              | '(' <leftop: list_item /(,|=>)/ list_item>(?) ')'
                  { $return = $item[2] }
    list_item : /\w/
};

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

while (<>)
{
    defined $parse->inputs($_) or print "Bad text!\n";
}

で、

Bad text!
()
$VAR1 = [];
( a=>1, b=>2 )
$VAR1 = [
          'a',
          '=>',
          '1',
          ',',
          'b',
          '=>',
          '2'
        ];
( a=>1 )
$VAR1 = [
          'a',
          '=>',
          '1'
        ];