use Parse::RecDescent;
my $teststr="blah1,blah2(blah3,blah4(blah5,blah6(blah7))),blah8";
my $grammar = q {
content: /[^\)\(\,]+/
function: content '(' list ')'
value: content
item: function | value
list: item ',' list | item
startrule: list
};
my $parser = new Parse::RecDescent ($grammar) or die "Bad grammar!\n";
defined $parser->startrule($teststr) or print "Bad text!\n";