#!/usr/bin/perl # http://perlmonks.org/?node_id=1188650 # Parsing Boolean expressions use strict; use warnings; use Data::Dump 'pp'; my @tests = grep /\S/, split /\n/, </r, "\n" } sub closeparen { /\G\)/gc ? shift : err "missing )" } sub expr { my $p = shift; # precedence /\G(?:\s+|#.*)+/gc; # skip whitespace my $answer = /\G(\w+)\s*/gc ? do { my $name = $1; /\G=/gc ? $vars->{$name} = expr(0) : $vars->{$name} } : /\G\(/gc ? closeparen expr(0) : err "syntax error"; /\G(?:\s+|#.*)+/gc, # skip whitespace $p <= 3 && /\G'/gc ? $answer ^= 1 : # highest precedence $p <= 2 && /\G\*/gc ? $answer &= expr(3) : $p <= 1 && /\G\+/gc ? $answer |= expr(2) : # lowest precedence return $answer while 1; } sub parse # takes expression string and ref to dictionary hash { (local $_, $vars) = @_; expr(0); /\G\z/gc or err "incomplete parse"; } # end of package Parsing::Boolean::Expressions