use Parse::RecDescent; use Data::Dumper; $::RD_AUTOACTION = q { [@item] }; my $grammar= q { start :seq seq : '('TAG (seq | word) | ("." "?")')' TAG : /[A-Z]+/ word : m(\w*) }; my $parser=Parse::RecDescent->new($grammar); my $result = $parser->start("(SBARQ (WHNP (WP What))(SQ (VBZ is)(NP (NNP Head)(NNP Start)))(. ?))"); print Dumper($result);