#!/usr/bin/perl # test.pl use strict; use warnings; use Data::Dumper qw( ); use Grammar qw( ); { my %keys_lkup = ( option => [qw( children )], switch => [qw( name value )], variable => [qw( name )], alternation => [qw( choices )], literal => [qw( value )], ); sub keys_by_type { my ($h) = @_; if (exists($h->{type})) { return [ qw( type ), @{ $keys_lkup{ $h->{type} } } ]; } else { return [ sort keys %$h ]; } } } { my $parser = Grammar->new(); while () { chomp; my $params = $parser->parse($_) or do { warn("Bad data at line $.\n"); next; }; print(">> $_\n"); print Data::Dumper ->new([ $params ], [qw( $params )]) ->Indent(1) ->Sortkeys(\&keys_by_type) ->Dump(); print("\n"); } } __DATA__ dfpm dataset add [-D] [-N ] { [] | [] | [] | [] | [] } nested-square [ [ param ] ] multi-child { foo | bar } partially-optimisable { | [] | [] [] }