#!/usr/bin/perl -sw # PARSE LOGICAL EXPRESSIONS use Parse::RecDescent; $grammar = q{ expr : '[' (?) ']' { $item[2] } | '[[' atomlist ']]' { $item[2] } | disj no_garbage { $item[1] } | atomlist: no_garbage: /^\s*$/ | disj : conj : and : 'and' unary : 'not' atom | '(' expr ')' { $item[2] } | atom atom : /(?!and|or)[a-z]/ num : /\d+/ }; $parse = new Parse::RecDescent ($grammar) or die "bad grammar"; $input = ''; use Data::Dumper; print "> "; while (<>) { if (/^\.$/) { print STDERR Data::Dumper->Dump([$parse->expr($input)]); $input = '' } else { $input .= $_ } print "> "; }