2 0 a #### input a #### use Parse::RecDescent; my $text = "input [2:0] a"; my $grammar = q { rule : 'input' range(?) identifier { print $item[1]."\n"; if (defined @{$item{range}->[0]}) { my @arr = @{$item{range}->[0]}; foreach my $i (@arr) { print $i."\n"; } } print $item{identifier}; } range : "[" from_num ":" to_num "]" {$return = [$item{from_num}, $item{to_num}]} from_num : number {$return = $item{number}} to_num : number {$return = $item{number}} number : /[0-9][0-9_]*/ identifier : /[a-zA-Z][a-zA-Z_0-9\.]*/ }; my $parser = new Parse::RecDescent($grammar) or die "Bad Grammar"; $parser->rule($text);