sub op { { '.and.' => '&&', '.or.' => '||', '.eq.' => '==', '.ne.' => '!=', '.eqv.' => '==', '.neqv.' => '!=', '.lt.' => '<', '.gt.' => '>', '.le.' => '<=', '.ge.' => '>=', }->{$_[0]} // $_[0]; } # left associative => term (.and. term)* sub expr { my $left = term(); $left = "(($left) " . op($1) . " (" . term() . '))' while /\G\s* (\.\w+\.) /gcx; return $left; }