#!/usr/bin/perl use Parse::RecDescent; $grammar = q{ startrule: root(s) root: object { print "root\n"; } object: name "(agg)=(" body(s?) closeobject { print "object <$item{name}>\n"; } name: /\w+/ body: /\s+/ | object | property { print "property $item{property}\n"; } property: name /\(\w+\s*\d*\)=/ value { "<$item{name}>$item{value}" } value: value1 | value2 value1: /\w+/ value2: /'.+'/ { substr $item[1], 1, (length $item[1]) - 2 } closeobject: ")" { print "close\n"; } }; $parser = Parse::RecDescent->new($grammar); undef $/; $text = <>; print "\n"; $parser->startrule($text); print "\n";