| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.290 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.290 |
| Problem: A non-greedy match followed by a branch is too greedy. (Ingo |
| Karkat) |
| Solution: Add NFA_MATCH when it is already in the state list if the position |
| differs. |
| Files: src/testdir/test64.in, src/testdir/test64.ok, src/regexp_nfa.c |
| |
| |
| |
| |
| |
| *** 238,244 **** |
| :call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz']) |
| :call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa','']) |
| :call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa']) |
| ! :call add(tl, [2, '\v(a{-1,3})+','aa','aa','a']) |
| :" |
| :" Test Character classes |
| :call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23']) |
| --- 238,248 ---- |
| :call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz']) |
| :call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa','']) |
| :call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa']) |
| ! :call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a']) |
| ! :call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x']) |
| ! :call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x']) |
| ! :call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x']) |
| ! :call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x']) |
| :" |
| :" Test Character classes |
| :call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23']) |
| |
| *** 462,476 **** |
| : try |
| : let l = matchlist(text, pat) |
| : catch |
| ! : $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"' |
| : endtry |
| :" check the match itself |
| : if len(l) == 0 && len(t) > matchidx |
| ! : $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"' |
| : elseif len(l) > 0 && len(t) == matchidx |
| ! : $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match' |
| : elseif len(t) > matchidx && l[0] != t[matchidx] |
| ! : $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"' |
| : else |
| : $put ='OK ' . engine . ' - ' . pat |
| : endif |
| --- 466,480 ---- |
| : try |
| : let l = matchlist(text, pat) |
| : catch |
| ! : $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"' |
| : endtry |
| :" check the match itself |
| : if len(l) == 0 && len(t) > matchidx |
| ! : $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"' |
| : elseif len(l) > 0 && len(t) == matchidx |
| ! : $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match' |
| : elseif len(t) > matchidx && l[0] != t[matchidx] |
| ! : $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"' |
| : else |
| : $put ='OK ' . engine . ' - ' . pat |
| : endif |
| |
| *** 483,489 **** |
| : let e = t[matchidx + i] |
| : endif |
| : if l[i] != e |
| ! : $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"' |
| : endif |
| : endfor |
| : unlet i |
| --- 487,493 ---- |
| : let e = t[matchidx + i] |
| : endif |
| : if l[i] != e |
| ! : $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"' |
| : endif |
| : endfor |
| : unlet i |
| |
| |
| |
| *** 533,538 **** |
| --- 533,550 ---- |
| OK 0 - \v(a{-1,3})+ |
| OK 1 - \v(a{-1,3})+ |
| OK 2 - \v(a{-1,3})+ |
| + OK 0 - ^\s\{-}\zs\( x\|x$\) |
| + OK 1 - ^\s\{-}\zs\( x\|x$\) |
| + OK 2 - ^\s\{-}\zs\( x\|x$\) |
| + OK 0 - ^\s\{-}\zs\(x\| x$\) |
| + OK 1 - ^\s\{-}\zs\(x\| x$\) |
| + OK 2 - ^\s\{-}\zs\(x\| x$\) |
| + OK 0 - ^\s\{-}\ze\(x\| x$\) |
| + OK 1 - ^\s\{-}\ze\(x\| x$\) |
| + OK 2 - ^\s\{-}\ze\(x\| x$\) |
| + OK 0 - ^\(\s\{-}\)\(x\| x$\) |
| + OK 1 - ^\(\s\{-}\)\(x\| x$\) |
| + OK 2 - ^\(\s\{-}\)\(x\| x$\) |
| OK 0 - \d\+e\d\d |
| OK 1 - \d\+e\d\d |
| OK 2 - \d\+e\d\d |
| |
| |
| |
| *** 4324,4331 **** |
| { |
| /* This state is already in the list, don't add it again, |
| * unless it is an MOPEN that is used for a backreference or |
| ! * when there is a PIM. */ |
| ! if (!nfa_has_backref && pim == NULL && !l->has_pim) |
| { |
| skip_add: |
| #ifdef ENABLE_LOG |
| --- 4324,4333 ---- |
| { |
| /* This state is already in the list, don't add it again, |
| * unless it is an MOPEN that is used for a backreference or |
| ! * when there is a PIM. For NFA_MATCH check the position, |
| ! * lower position is preferred. */ |
| ! if (!nfa_has_backref && pim == NULL && !l->has_pim |
| ! && state->c != NFA_MATCH) |
| { |
| skip_add: |
| #ifdef ENABLE_LOG |
| |
| |
| |
| *** 736,737 **** |
| --- 736,739 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 290, |
| /**/ |
| |
| -- |
| Although the scythe isn't pre-eminent among the weapons of war, anyone who |
| has been on the wrong end of, say, a peasants' revolt will know that in |
| skilled hands it is fearsome. |
| -- (Terry Pratchett, Mort) |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |