#!/usr/bin/perl use warnings; use strict; use Data::Dumper; $Data::Dumper::Terse=1; my $precedence=[qr/&&/,qr/\|\|/,qr/\+/,qr/-/,qr/\//,qr/\*/]; sub parse; while(<>){ my $tree = parse($precedence,$_); print Dumper($tree); } sub parse{ my ($regex,$input)=@_; my ($node,$before,$op,$after); $input=~s/\s//g; for(@$regex){ $input=~m/(.+)($_)(.+)/; if($3){ ($before,$op,$after)=($1,$2,$3); last; } } return $input if !defined($after); $node->{$op}=[parse($regex,$before),parse($regex,$after)]; return $node; } #### 5+4*3&&COND||COND2||COND3&&ANOTHER #### { '&&' => [ { '&&' => [ { '+' => [ '5', { '*' => [ '4', '3' ] } ] }, { '||' => [ { '||' => [ 'COND', 'COND2' ] }, 'COND3' ] } ] }, 'ANOTHER' ] }