ディレクティブ 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' ];