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