#!/usr/bin/perl # make_parser.pl use strict; use warnings; use Parse::RecDescent qw( ); my $grammar = <<'__END_OF_GRAMMAR__'; { use strict; use warnings; } parse : item_list /\Z/ { $item[2] } item_list : { $item[1] } item : prefix bodies { [ $item[1], $item[2] ] } | bodies { [ undef, $item[1] ] } bodies : group { $item[1] } | body { [ $item[1] ] } prefix : '<*' INTEGER '>' { $item[2] } group : '(' ')' { $item[2] } body : NAME suffix(?) { [ $item[1], @{ $item[2] } ] } suffix : '<' suffix_list '>' { $item[2] } suffix_list : INTEGER suffix_list_[ $item[1] ] suffix_list_ : ',' { [ ',' => $arg[0], @{ $item[2] } ] } | ':' { [ ':' => $arg[0], @{ $item[2] } ] } | { [ '' => $arg[0] ] } INTEGER : /0|[1-9][0-9]*/ NAME : /[A-Za-z][A-Za-z0-9_]*/ __END_OF_GRAMMAR__ Parse::RecDescent->Precompile($grammar, 'Grammar') or die("Bad grammar\n");