use Parse::RecDescent; use Data::Dumper; use strict; use warnings; $::RD_TRACE = 1; my $grammar = q~ expression: eod termop: /and/i | /xor/i | /or/i term: '(' expression ')' | condition condition: element comparison element element: '<' /-?\w+/ '>' | /\d+/ comparison: /=[><]=/ | /=?[><]=?/ | '=' | '!=' eod: /^\Z/ ~; my $parser = new Parse::RecDescent($grammar) or die; #defined($parser->RecTest('h =>= h')) or die; my $test = '( => )'; # or ( = and = )'; print Dumper($parser->expression($test));