> I think I can distinguish :: from ::: - :: fails the current branch point, > whereas ::: fails the entire rule.
Correct. > I think I can distinguish between ::: and <commit>; the implementation > is a bit tricky, because ::: fails the current match - easy enough - > whereas <commit> has to specify to all upper-level matches that they > failed too. Is it reasonable for failing a <commit> to be an exception? It's not an exception, but you could certainly *implement* it that way. > I don't think I can distinguish between : and ::. Essentially, how many > nodes does each commit to? I would expect the following > > [ a+ : b | c+ : d | e+ : f ] > > to do precisely the same as > > [ a+ :: b | c+ :: d | e+ :: f ] It doesn't. The first says: [ # Non-capturingly... a+ # Match 1+ a's : # And never backtrack to match fewer a's b # Then match a b | # Or if that failed... c+ # Match 1+ c's : # And never backtrack to match fewer c's d # Then match a d | # Or if that failed... e+ # Match 1+ e's : # And never backtrack to match fewer e's f # Then match an ] whereas the second says: [ # Non-capturingly... a+ # Match 1+ a's :: # And if you ever have to backtrack, # then immediately fail the entire surrounding group b # Then match a b | # Or if that failed... c+ # Match 1+ c's :: # And if you ever have to backtrack, # then immediately fail the entire surrounding group d # Then match a d | # Or if that failed... e+ # Match 1+ e's :: # And if you ever have to backtrack, # then immediately fail the entire surrounding group f # Then match an f ] So a single colon has the same effect as the Perl 5 (?>...) metasyntax. > I don't see why Larry describes one as "if-then", but not the other. > Basically, I don't think I'm sure what : "gives up". It gives up tracktracking the immediately preceding atom. The behaviour is explained quite well in E5 I think. Damian