I wonder if you offer generosity.
Simple regular expression recursion is gosub with pass / fail return, which turns out to be stackable.
The following is a Perl procedure that passes Perl's own parsing algorithm for the simple operators and simple syntax rules that you specified. This is done in one regex because your needs are extremely simple.
It looks weird, but solves the simple balanced text '()'. It seems Dot Net can do this. You just need to make a replacement (i.e. (? & Var)), do
Dot Net's balanced grouping requires ... instant verification.
I am posting this because nesting is not a problem. The problem is that as simple as parsing, the devil seems to be in the details.
^ (?: ^ (?&sign)? (?&number) | (?&operator) (?<! ^ (?:\/|\*) ) (?<! ^ [*]{2} ) (?&sign)? (?&number) | (?: (?&operator) (?<! ^ (?:\/|\*) ) (?<! ^ [*]{2} ) (?<! [(] (?:\/|\*) ) (?<! [(] [*]{2} ) (?&sign)? | (?<= [(] ) | ^ (?&sign)? ) (?<term> \( (?: (?> (?&sign)? (?&number) (?: (?&operator) (?&sign)? (?&number) )* ) | (?> (?: (?<= [(] ) | (?&operator) ) (?<! [(] (?:\/|\*) ) (?<! [(] [*]{2} ) (?&sign)? (?&term) ) )* \) (?! [(] ) (?> (?&operator) (?&sign)? (?&number) )* ) )* $ (?(DEFINE) (?<number> \d+(?:\.\d+)? ) (?<sign> [+-] ) (?<operator> (?: [*]{2} | [\/*] | (?<pm>[-+]) (?! \k<pm>) ) ) )
Exit
passed '' passed '(6**-2**3)' passed '6-+2' passed '-(-(8*((2)/3)))' passed '-((8*((2)/3)))' passed '-((8*((2**4)/3)))' passed '-((8*((2**4)/3)))**((-1)*(8*((2**4/99)/3)))' passed '-((8*((2**4)/3)))**((-1)*(8*((2**-4/99)/3)))' passed '-((8*((2**4)/3)))**-((-1)*(8*((2**-4/99)/3)))' passed '((8*((2)/3)))' passed '((8*((2)/3)))' passed '+((8*((-2)/-3)))' passed '8-6*2' passed '-8-6*2' passed '((8*((2-(8*(8+6)/2))/3))-7*2/234)+8/2*1' passed '-(8*(8+6)/2)' passed '(9*9/9)' passed '(9*(9)/9*(9*(9)/9)*1)' passed '(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))' failed '(6--2)' failed '-(/(8*((2)/3)))' failed '-((8*((2(6))/3)))' failed '+((8*((+2)/--3)))' failed '+((8*((+2)/--3+)))' failed '+((8*((*2)/--3)))' failed '+((8*((*2)/-3)))' failed '-((8*((-2)/+-3)))' failed '+8/2(1)' failed '-(8)*(8/(' failed '-(8)*(8/()' failed '*(9*9/9)' failed '*(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))' failed '/(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'
source share