#! /usr/bin/perl use strict; use warnings; use 5.010; my $query = q{ body:("et tu" (Brute OR Caesar)) AND published:[1900 TO 2010] NOT author:Shakespeare }; my $grammar = do{ use Regexp::Grammars; qr{ \A \s* \s* \Z <[And_Clause]>+ % (OR) <[Term]>+ % <[And_Operator]> AND | NOT | \s++ (?: : )? (?: \( \) | | | ) <.Non_Keyword> \w++ \[ TO \] ' ' | " " <.Non_Keyword> [^'"()][^\s()]*+ (?! NOT | AND | OR | \( | \) ) }xms; }; if ($query =~ $grammar) { use Data::Dumper 'Dumper'; say Dumper \%/; } else { say 'Failed'; }