in reply to Re: Re: Dice calcs?
in thread Dice calcs?

Oh, good bug-find. Here's a couple of fixes that you've prolly already done

1. To get it to do the multiple @ operators at the same level you need to

use Regexp::Common
Then replace the 'Precedence 5' regexp with:
$term=~s/(\d+)@($RE{balanced}{-parens=>'[]'})/rpt($1,$2)/eg;

2.To get it to do the * and / from left to right, change 'Precedence 3' to this single regexp:

$term=~s/(\d+)([\*\/])(\d+)/int(eval("$1$2$3"))/eg;
and change 'Precedence 4' to
$term=~s/(\d+)([+-])(\d+)/eval("$1$2$3")/eg;

Hope these help you with your efforts. There is still no syntax checking but I figure you can handle stopping people from putting 3*+/4. Oh, and you probably want to handle negative numbers before 'Precedence 4'

Replies are listed 'Best First'.
Re: Re: Re: Re: Dice calcs?
by Anonymous Monk on Sep 19, 2002 at 14:11 UTC
    I handled the matching parens in the subroutine.

    Your fix to precedence 3 still isn't going to work:

    my $x = '20*5/3*3'; $x =~ s/(\d+)([\*\/])(\d+)/int(eval("$1$2$3"))/eg; print "$x\n"; Output: 100/9

    I'm okay for the moment with non-shared precedence. That's what parens are for. :-)

    I also changed some of the logic in the determine sub, because as you can see from above, one s/// pass isn't always enough. I didn't want lower-precedence operators being evaluated before all of the higher-precedences had been taken care of. That helped with the unary - problem... I made - a higher precedence than + and tweaked the rx's slightly.

    The only bit I have left to do (when I can find time) is to add a pre-parser similar to my infix-to-postfix program that will go a long way to validating syntax (but this isn't exactly a mission-critical module either :-)

    Thanx!
    Matt Stum