#!/usr/bin/perl # http://perlmonks.org/?node_id=1210791 use strict; use warnings; sub error { die s/\G/ *** Expected @_ -->/r, "\n" } sub want { /\G\s+/gc; /\G\Q$_[1]\E/gc ? shift : error "'$_[1]'" } sub expr { my $p = shift; /\G\s+/gc; my $value = /\G(T|F)/gc ? $1 : /\G\(/gc ? want expr(0), ')' : error "Operand"; $value = /\G\s+/gc ? $value : $p <= 1 && /\G\&\&/gc ? $value eq 'T' ? expr(2) : (expr(2), 'F') : $p <= 0 && /\G\|\|/gc ? $value eq 'T' ? (expr(1), 'T') : expr(1) : return $value while 1; } while() { my $answer = expr(0); /\G\s*\z/ or error "Complete Parse"; print tr/\n//dr, " = $answer\n"; } __DATA__ (T && F) || (F && F) (T && T) || (F && F) (T && F) || T #### (T && F) || (F && F) = F (T && T) || (F && F) = T (T && F) || T = T