exilepanda has asked for the wisdom of the Perl Monks concerning the following question:
The first problem come to me is how do I resolve those brackets, so I can determine the logic's precedence. Now I have this :
$expr = '(A&(B&C)|((C&D)|\((A EQ 1)))'; # 01234567890123456789012345678 my (@open, @close); my @charArr = split //, $expr; foreach my $pos ( 0..$#charArr ) { push @open, $pos if ( $charArr[$pos] =~ /\(/ && $charArr[$pos-1] n +e "\\" ) ; push @close, $pos if ( $charArr[$pos] =~ /\)/ && $charArr[$pos-1] +ne "\\" ) ; } die "Imbalance Pair" unless @open == @close; print "@open$/@close$/$/"; my @preced; foreach my $firstClose ( @close ) { my @temp = (); while ( @open ) { my $lastOpen = pop @open; if ( $lastOpen < $firstClose ) { push @preced, "$lastOpen - $firstClose"; @open = (@open, @temp); last } else { unshift @temp, $lastOpen; } } } print $_.$/ foreach @preced; __END__ prints: 0 3 9 10 18 7 14 25 26 27 3 - 7 10 - 14 18 - 25 9 - 26 0 - 27
The @preced carries the string positions of each open-end brackets, and their precedence order. However, it looks like a stupid algorithm, which sound unsafe and not efficient.
My questions :
1. What is the terminology of this sort of issues ? I like to look up more, but I don't know what is it called
2. Is there any module actually suits for this kind of case? What I have only a start up, implementing each block is another issue, if more operators are needed later, like >= == != boolean, string compare etc. situations. I can't foresee what's gonna happen.
Any clues for me ? Thanks in advance.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Need a start point for resolving {[()]}
by hdb (Monsignor) on Jun 13, 2013 at 07:21 UTC | |
by exilepanda (Friar) on Jun 13, 2013 at 11:39 UTC | |
Re: Need a start point for resolving {[()]}
by Skeeve (Parson) on Jun 13, 2013 at 06:45 UTC | |
by exilepanda (Friar) on Jun 13, 2013 at 11:32 UTC | |
Re: Need a start point for resolving {[()]}
by Anonymous Monk on Jun 13, 2013 at 06:35 UTC | |
by exilepanda (Friar) on Jun 13, 2013 at 11:55 UTC |