To: vim_dev@googlegroups.com Subject: Patch 7.4.290 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.4.289/src/testdir/test64.in 2014-05-13 15:56:45.017670668 +0200 --- src/testdir/test64.in 2014-05-13 16:15:57.213680754 +0200 *************** *** 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 *** ../vim-7.4.289/src/testdir/test64.ok 2014-05-13 15:56:45.017670668 +0200 --- src/testdir/test64.ok 2014-05-13 16:39:35.077693166 +0200 *************** *** 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 *** ../vim-7.4.289/src/regexp_nfa.c 2014-05-13 15:56:45.021670668 +0200 --- src/regexp_nfa.c 2014-05-13 16:37:58.481692320 +0200 *************** *** 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 *** ../vim-7.4.289/src/version.c 2014-05-13 15:56:45.025670668 +0200 --- src/version.c 2014-05-13 16:13:33.953679500 +0200 *************** *** 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 ///