#!/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; }