my $grammar = <<'GRAMMAR'; parse: network_object(s) network_object: 'network' ':' /(\w+)/ '=' '{' ip_def mask_def host(s) '}' { $return = { NETWORK => $item[3], SUBNET => $item[6], NETMASK => $item[7], HOSTS => $item[8], }; } mask_def : 'mask' '=' ip ';' { $return = $item[3]; } ip_def : 'ip' '=' ip ';' { $return = $item[3]; } host : 'host' ':' /\w+/ '=' '{' ip_or_range '}' { $return = [$item[3], $item[6]]; } ip_or_range : 'ip' '=' ip ';' { $return = $item[3]; } | 'range' '=' ip '-' ip ';' { $return = {RANGE_START => $item[3], RANGE_END => $item[5]}; } ip : /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ { $return = $item[1]; } GRAMMAR