# New Ticket Created by Shy Guy
# Please include the string: [perl #131991]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=131991 >
*Description:*
Longest alternation seems to only evaluate the first nested alternation of
its right side arguments.
That is, if the first regex of an alternation <||> following longest
alternation <|> fails, and the regex preceding the longest alternation
succeeds, the longest alternation uses the preceding/ left side match
rather than evaluating the rest of the right side alternation which could
have a potentially longer match.
*Example 1:*
'succeed'.match(/ suc | [ fail || succeed ]/).say;
Returns:
「suc」
Expected:
「succeed」
*Example 2:*
grammar TEST {
regex NestedAlternation { fail || succeed }
regex LongestAlternation { suc | <NestedAlternation> }
regex TOP { <LongestAlternation> .* }
}
TEST.parse('succeed').say;
Returns:
「succeed」
LongestAlternation => 「suc」
Expected:
「succeed」
LongestAlternation => 「succeed」
NestedAlternation => 「succeed」
Note if we remove the trailing '.*' in TOP, backtracking forces it to
evaluate the NestedAlternation and return the expected result. However,
backtracking back into the NestedAlternation should not be necessary.
*Example 3:*
grammar TEST {
token NestedAlternation { fail || succeed }
token LongestAlternation { suc | <NestedAlternation> }
token TOP { <LongestAlternation> }
}
TEST.parse('succeed').say;
Returns:
Nil
Expected:
「succeed」
LongestAlternation => 「succeed」
NestedAlternation => 「succeed」