I like
Marpa::R2 for building grammars:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use Marpa::R2;
my $dsl = << '__DSL__';
lexeme default = latm => 1
Assignment ::= var ('=') Expression action => ASSIGN
Expression ::= var action => VAR
| ('(') Expression (')') action => ::first assoc
+=> group
|| Expression (q) action => NOT
|| Expression ('*') Expression action => AND
|| Expression ('+') Expression action => OR
q ~ [']
var ~ [A-Z]+
:discard ~ whitespace
whitespace ~ [\s]+
__DSL__
my %var;
sub ASSIGN { $var{ $_[1] } = 0 + $_[2] }
sub NOT { ! $_[1] }
sub AND { $_[1] && $_[2] }
sub OR { $_[1] || $_[2] }
sub VAR { $var{ $_[1] } }
my @input = ('Y = A + (B*C)',
"Y = A + (B' + (C*D)')",
"Y = A*(B*(C'+D)')");
my $grammar = 'Marpa::R2::Scanless::G'->new({ source => \$dsl });
for my $line (@input) {
%var = map +( $_ => int rand 2 ), 'A' .. 'D';
my $result = $grammar->parse(\$line, { semantics_package => 'main'
+ });
say join ' ', %var;
}
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,