network_object: 'network' ':' /(\w+)/ '=' '{' ip_def mask_def host(s) '}'
####
host : 'host' ':' /\w+/ '=' '{' ip_or_range '}'
####
ip_or_range : 'ip' '=' ip ';'
| 'range' '=' ip '-' ip ';'
####
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
####
$VAR1 = [
{
'NETMASK' => '255.255.255.0',
'HOSTS' => [
[
'asterix',
'10.1.1.10'
],
[
'obelix',
'10.1.1.11'
],
[
'idefix',
'10.1.1.12'
],
[
'ix_13_20',
{
'RANGE_START' => '10.1.1.13',
'RANGE_END' => '10.1.1.20'
}
]
],
'NETWORK' => 'north',
'SUBNET' => '10.1.1.0'
}
];