#!/usr/bin/perl # make_parser.pl use strict; use warnings; use Parse::RecDescent (); my $grammar = <<'__EOI__'; parse : expr eof { $item[1] } eof : /^\Z/ expr : expr_(s?) term { [ (map{@$_}@{$item[1]}), $item[2] ] } expr_ : term binop { [ $item[1], $item[2] ] } term : unary term { [ $item[1], $item[2] ] } | /"[^"]*"\[MESH\]/ { [ 'MESH', $item[1] ] } | '(' expr ')' { [ 'PAREN', $item[2] ] } binop : 'OR' { $item[1] } | 'AND' { $item[1] } | 'NOT' { $item[1] } # unary : 'NOT' { $item[1] } # I don't know what to do with it, # so I'm not supporting it. unary : { undef } __EOI__ $::RD_HINT = 1; # $::RD_TRACE = 1; rename('MeshGrammar.pm', 'MeshGrammar.pm.bak'); Parse::RecDescent->Precompile($grammar, 'MeshGrammar') or die("Bad grammar.\n");