my $grammar = q { start : block(s /\n\n+/) /\Z/ { $return = join("\n\n", @{$item[1]}); } }; my $essential = q { block : line(s /\n/) { join("\n", @{$item[1]}) } line : inline(s) { join("", @{$item[1]}) } inline : plain { $item{plain} } plain : /[^\n]/ }; my $parser = new Parse::RecDescent($grammar) or die; $parser->Replace($extra); $parser->Extend($essential);