НКА должен пройти кросс-тесты от PCRE

Issue #79 resolved
Oleg Sychev repo owner created an issue

Originally reported on Google Code with ID 79

Неплохо бы иметь в комплекте кросс-тестов от PCRE.
Основной набор тестов можно посмотреть http://vcs.pcre.org/viewvc/code/trunk/testdata/testinput1?view=markup

Reported by oasychev on 2011-12-19 14:35:39

Comments (118)

  1. Oleg Sychev reporter

    ``` Найти человека на летнюю практику? ```

    Reported by `oasychev` on 2011-12-19 14:35:47

  2. Oleg Sychev reporter

    ``` Спасибо Бондаренко за перевод кросс-тестов, теперь можно ими пользоваться.

    Для начала бы неплохо проанализировать и сгруппировать фейлы... ```

    Reported by `oasychev` on 2012-09-23 21:47:03

  3. Oleg Sychev reporter

    ``` Прикрепляю файл с фейлами от обоих тестовых систем.

    Наиболее интересующие меня ситуации выделены сдвигом данных о фейле. Перед ними написан словами мой комментарий. Если что непонятно - спрашивайте.

    Жду вашего мнения об этих фейлах. Там есть такие, которые стоило бы пофиксить...

    ```

    Reported by `oasychev` on 2012-10-02 14:50:25

    <hr>

  4. Oleg Sychev reporter

    ``` Фейлы которые вызывают вопросы - Валерий, отвечайте по ним потихоньку с указанием номеров...

    1) nfa_matcher failed on regex '^(b+|a){1,2}c' and string 'abbbbbbbbbbbac' (qtype_preg_cross_tests_from_pcre, data_for_test_subpattern_and_alternative_and_greedy_quantifiers INDEX_FIRST: 0=>0, 1=>0, expected: INDEX_FIRST: 0=>0, 1=>1,

    nfa_matcher failed on regex '^(b+|a){1,2}c' and string 'abbbbbbbbbbbac' (qtype_preg_cross_tests_from_pcre, data_for_test_subpattern_and_alternative_and_greedy_quantifiers LENGTH: 0=>12, 1=>1, expected: LENGTH: 0=>12, 1=>11, Я не понимаю, как может тут при длине совпадения 12 быть подмаска длиной 1. Такое впечатление, что для конечных квантификаторов при разворачивании не учитываются подмаски и при втором прохождении оно не затирает первое. ИМХО баг. Сложно исправить?

    2) Откуда здесь могло взяться полное совпадение? nfa_matcher failed on regex '^\".*\"\s*(;.*)?$' and string '"1234" : things' (qtype_preg_cross_tests_from_pcre, data_for_test_any_character_and_space_character_in_quantifiers_and_subpattern FULL: TRUE expected: FULL: FALSE

    nfa_matcher failed on regex '^\".*\"\s*(;.*)?$' and string '"1234" : things' (qtype_preg_cross_tests_from_pcre, data_for_test_any_character_and_space_character_in_quantifiers_and_subpattern LENGTH: 0=>15, 1=>-1, expected: LENGTH: 0=>7,

    3) По коду листов-ассертов \A \Z реализованы были, работали эквивалентно ^ $ ввиду отсутствия переводов строк. Откуда проблемы с ними? И непонятно почему со второй строкой не берет 3 совпадения, а только 2. nfa_matcher failed on regex '\A(abc|def)=(\1){2,3}\Z' and string 'abc=abcabc' (qtype_preg_cross_tests_from_pcre, data_for_test_back_reference FULL: FALSE expected: FULL: TRUE

    nfa_matcher failed on regex '\A(abc|def)=(\1){2,3}\Z' and string 'def=defdefdef' (qtype_preg_cross_tests_from_pcre, data_for_test_back_reference INDEX_FIRST: 0=>0, 1=>0, 2=>7, expected: INDEX_FIRST: 0=>0, 1=>0, 2=>10,

    nfa_matcher failed on regex '\A(abc|def)=(\1){2,3}\Z' and string 'def=defdefdef' (qtype_preg_cross_tests_from_pcre, data_for_test_back_reference LENGTH: 0=>10, 1=>3, 2=>3, expected: LENGTH: 0=>13, 1=>3, 2=>3,

    4) Проверить интерпретацию \число внутри символьного класса - по правилам там он не может быть подмаской, даже если число 10 и менее. Или просто символ с таким кодом вызывает проблемы? nfa_matcher failed on regex 'abc[\10]de' and string 'abcde' (qtype_preg_cross_tests_from_pcre, data_for_test_oct_code_of_character_in_character_class FULL: FALSE expected: FULL: TRUE

    nfa_matcher failed on regex 'abc[\10]de' and string 'abcde' (qtype_preg_cross_tests_from_pcre, data_for_test_oct_code_of_character_in_character_class LENGTH: 0=>3, expected: LENGTH: 0=>4,

    nfa_matcher failed on regex 'abc[\1]de' and string 'abcde' (qtype_preg_cross_tests_from_pcre, data_for_test_oct_code_of_character_in_character_class_2 FULL: FALSE expected: FULL: TRUE

    nfa_matcher failed on regex 'abc[\1]de' and string 'abcde' (qtype_preg_cross_tests_from_pcre, data_for_test_oct_code_of_character_in_character_class_2 LENGTH: 0=>3, expected: LENGTH: 0=>6,

    nfa_matcher failed on regex '(abc)[\1]de' and string 'abcde' (qtype_preg_cross_tests_from_pcre, data_for_test_oct_code_of_character_in_character_class_3 FULL: FALSE expected: FULL: TRUE

    nfa_matcher failed on regex '(abc)[\1]de' and string 'abcde' (qtype_preg_cross_tests_from_pcre, data_for_test_oct_code_of_character_in_character_class_3 LENGTH: 0=>3, 1=>3, expected: LENGTH: 0=>6, 1=>3,

    5) Здесь, видимо, ошибка в тесте - по крайней мере по основной длине, исправите? nfa_matcher failed on regex '^(a\1?)(a\1?)(a\2?)(a\3?)$' and string 'aa' (qtype_preg_cross_tests_from_pcre, data_for_test_back_references_in_quantifiers_in_subpatterns LENGTH: 0=>2, 1=>1, 2=>1, 3=>-1, 4=>-1, expected: LENGTH: 0=>1, 1=>1, 2=>1,

    nfa_matcher failed on regex '^(a\1?)(a\1?)(a\2?)(a\3?)$' and string 'aaa' (qtype_preg_cross_tests_from_pcre, data_for_test_back_references_in_quantifiers_in_subpatterns LENGTH: 0=>3, 1=>1, 2=>1, 3=>1, 4=>-1, expected: LENGTH: 0=>1, 1=>1, 2=>1, 3=>1,

    6) В первом примере left в тесте правильный (ибо добавлять символ надо сначала), у НКА - нет. Во втором правильный у НКА. В третьем по идее вообще должно быть полное совпадение и соответственно нулевой left если я прав.

    nfa_matcher failed on regex '\Ba\B' and string 'a-' (qtype_preg_cross_tests_from_pcre, data_for_test_not_word LEFT: 1 expected: LEFT: 3

    nfa_matcher failed on regex '\Ba\B' and string '-a' (qtype_preg_cross_tests_from_pcre, data_for_test_not_word LEFT: 1 expected: LEFT: 3

    nfa_matcher failed on regex '\Ba\B' and string '-a-' (qtype_preg_cross_tests_from_pcre, data_for_test_not_word LEFT: 1 expected: LEFT: 3

    7) А здесь почему не находится совпадение ef - очень странно nfa_matcher failed on regex '(abc|)ef' and string 'abcdef' (qtype_preg_cross_tests_from_pcre, data_for_test_alternative_without_second_branch_in_subpattern FULL: FALSE expected: FULL: TRUE

    nfa_matcher failed on regex '(abc|)ef' and string 'abcdef' (qtype_preg_cross_tests_from_pcre, data_for_test_alternative_without_second_branch_in_subpattern INDEX_FIRST: 0=>0, 1=>0, expected: INDEX_FIRST: 0=>4, 1=>4,

    nfa_matcher failed on regex '(abc|)ef' and string 'abcdef' (qtype_preg_cross_tests_from_pcre, data_for_test_alternative_without_second_branch_in_subpattern LENGTH: 0=>3, 1=>3, expected: LENGTH: 0=>2, 1=>0,

    Продолжение следует.... ```

    Reported by `oasychev` on 2012-10-09 14:43:11

  5. Oleg Sychev reporter
    8) ИМХО в тесте ошибка, тут с учетом ассертов никакого совпадения быть не может
    Это исправляется легко
    nfa_matcher failed on regex '^(a\1?){4}$' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_back_reference_in_quantifier_in_subpattern_in_quantifier_2
        IS_MATCH:    FALSE
        expected:
        IS_MATCH:    TRUE
    
        nfa_matcher failed on regex '^(a\1?){4}$' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_back_reference_in_quantifier_in_subpattern_in_quantifier_2
        INDEX_FIRST: 0=>-1, 1=>-1, 
        expected:
        INDEX_FIRST: 0=>5, 
    
        nfa_matcher failed on regex '^(a\1?){4}$' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_back_reference_in_quantifier_in_subpattern_in_quantifier_2
        LENGTH:      0=>-1, 1=>-1, 
        expected:
        LENGTH:      0=>1, 
    
        nfa_matcher failed on regex '^(a\1?){4}$' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_back_reference_in_quantifier_in_subpattern_in_quantifier_2
        LEFT:        4
        expected:
        LEFT:        3
    
    9) Это легко, по правилам вертикальная табуляция не входит в \s (но входит в [:space:])
    nfa_matcher failed on regex '[\s]+' and string '>   
            
            ?<' (qtype_preg_cross_tests_from_pcre, data_for_test_space_character_in_character_class_in_quantifier
            LENGTH:      0=>6, 
            expected:
            LENGTH:      0=>5, 
    
            nfa_matcher failed on regex '\s+' and string '>     
            
            ?<' (qtype_preg_cross_tests_from_pcre, data_for_test_space_character_in_quantifier
            LENGTH:      0=>6, 
            expected:
            LENGTH:      0=>5, 
    
    10)А вот простая ситуация где жадность квантификатора (звездочки) мешает обратной ссылке
    похоже, по крайней мере я не понимаю почему еще он может не работать
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference
        FULL:        FALSE
        expected:
        FULL:        TRUE
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference
        LENGTH:      0=>9, 1=>5, 
        expected:
        LENGTH:      0=>9, 1=>3, 
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123bc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference
        FULL:        FALSE
        expected:
        FULL:        TRUE
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123bc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference
        LENGTH:      0=>7, 1=>4, 
        expected:
        LENGTH:      0=>7, 1=>2, 
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference_modifier_s
        FULL:        FALSE
        expected:
        FULL:        TRUE
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference_modifier_s
        LENGTH:      0=>9, 1=>5, 
        expected:
        LENGTH:      0=>9, 1=>3, 
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123bc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference_modifier_s
        FULL:        FALSE
        expected:
        FULL:        TRUE
    
        nfa_matcher failed on regex '(.*)\d+\1' and string 'abc123bc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_subpattern_and_digit_in_quantifier_and_back_reference_modifier_s
        LENGTH:      0=>7, 1=>4, 
        expected:
        LENGTH:      0=>7, 1=>2, 
    
        nfa_matcher failed on regex '((.*))\d+\1' and string 'abc123abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_nested_subpatterns_and_digit_in_quantifier_and_back_reference
        FULL:        FALSE
        expected:
        FULL:        TRUE
    
        nfa_matcher failed on regex '((.*))\d+\1' and string 'abc123abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_nested_subpatterns_and_digit_in_quantifier_and_back_reference
        LENGTH:      0=>9, 1=>5, 2=>5, 
        expected:
        LENGTH:      0=>9, 1=>3, 2=>3, 
    
        nfa_matcher failed on regex '((.*))\d+\1' and string 'abc123bc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_nested_subpatterns_and_digit_in_quantifier_and_back_reference
        FULL:        FALSE
        expected:
        FULL:        TRUE
    
        nfa_matcher failed on regex '((.*))\d+\1' and string 'abc123bc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_in_nested_subpatterns_and_digit_in_quantifier_and_back_reference
        LENGTH:      0=>7, 1=>4, 2=>4, 
        expected:
        LENGTH:      0=>7, 1=>2, 2=>2, 
    
    11) Похоже что НКА в данном тесте решил, что раз изначально подмаска была пропущена
    по ?, так уж при генерации продолжения ее никак нельзя получить, что, конечно, ошибка.
    nfa_matcher failed on regex '(another)?(\1+)test' and string 'hello world test' (qtype_preg_cross_tests_from_pcre,
    data_for_test_subpattern_in_quantifier_and_back_reference_in_quantifier_in_subpattern_2
            NEXT:        
            expected:
            NEXT:        a
    
            nfa_matcher failed on regex '(another)?(\1+)test' and string 'hello world test'
    (qtype_preg_cross_tests_from_pcre, data_for_test_subpattern_in_quantifier_and_back_reference_in_quantifier_in_subpattern_2
            LEFT:        999999999
            expected:
            LEFT:        18
    
    12) Полностью сейчас мы эту ситуацию не разрешим, но по крайней мере в next не должно
    быть пробела, это я думаю очевидно. Давайте не пропускать ошибку в тесте, пока она
    замечена - ее нелегко заметить.
     nfa_matcher failed on regex '^[a-z 0-9]\b[a-z 0-9]\B[a-z 0-9]' and string '  b' (qtype_preg_cross_tests_from_preg,
    data_for_test_assertions_simple_1
        NEXT:        
        expected:
        NEXT:        [a-z 0-9]
    
    Для начала все. Это самые очевидные проблемы, не связанные с правилами жадности, переводами
    строк и ассертами. Какие-то из них сможете исправить в ближайшее время? Мы релиз уже
    затягиваем...
    

    Reported by oasychev on 2012-10-14 19:19:22

  6. Oleg Sychev reporter
    Переименовал файлы и исправил группу выражений, оставшихся в BRE-синтаксисе в AT&T null
    subexpression.
    

    Reported by oasychev on 2012-11-04 14:50:40

  7. Oleg Sychev reporter
    случай 6) - после подробного рассмотрения выяснилось, что тест как раз прав. Там везде
    по 3 символа, снимаем с рассмотрения.
    

    Reported by oasychev on 2012-11-04 15:00:50

  8. Oleg Sychev reporter
    К обсуждению самих тестов, посмотрите Валерий
    13) dfa_matcher failed on regex '((?i)AB(?-i)C|D)E' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_modiier_i_and_not_i_in_alternative_in_subpattern
    IS_MATCH:    TRUE
    expected:
    IS_MATCH:    FALSE
    
    dfa_matcher failed on regex '((?i)AB(?-i)C|D)E' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_modiier_i_and_not_i_in_alternative_in_subpattern
    INDEX_FIRST: 0=>5, 
    expected:
    INDEX_FIRST: 
    
    dfa_matcher failed on regex '((?i)AB(?-i)C|D)E' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_modiier_i_and_not_i_in_alternative_in_subpattern
    LENGTH:      0=>1, 
    expected:
    LENGTH:      
    
    dfa_matcher failed on regex '((?i)AB(?-i)C|D)E' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_modiier_i_and_not_i_in_alternative_in_subpattern
    NEXT:        B
    expected:
    NEXT:        D
    
    dfa_matcher failed on regex '((?i)AB(?-i)C|D)E' and string '*** Failers' (qtype_preg_cross_tests_from_pcre,
    data_for_test_modiier_i_and_not_i_in_alternative_in_subpattern
    LEFT:        3
    expected:
    LEFT:        2
    
    На самом деле вариант ДКА мне представляется более правильным, т.к. по правилу 2 worse_than
    у нас наличие совпадения выигрывает над его отсутствием ранее, чем длина left учитывается.
    
    Согласны с тем, что тест требует исправления?
    
    НКА этот тест не провалил, между прочим, что странно... Но пока давайте хотя бы договоримся
    насчет самого теста... 
    
    И по 12 - вы согласны насчет исправления теста или нет? Нужно ваше мнение, да и дело
    там пустяковое - хоть вам, хоть мне один символ поправить...
    

    Reported by oasychev on 2012-12-04 21:11:28

  9. Valeriy Streltsov
    По поводу 13 согласен, dfa прав, тест нужно исправить.
    

    Reported by vostreltsov on 2012-12-10 11:28:47

  10. Valeriy Streltsov
    По 12 тоже согласен. Странно, что там такая ошибка - этот тест тянется еще с КНПО
    

    Reported by vostreltsov on 2012-12-10 13:55:27

  11. Oleg Sychev reporter
    Ошибку в 12 наверное внесли когда конвертили next под регулярные выражения этим летом.
    

    Reported by oasychev on 2012-12-10 13:59:53

  12. Oleg Sychev reporter
    9 бы исправить - это легко, в листьях, но позволяет с чистой совестью говорить что система
    символьных классов хорошо работает....
    

    Reported by oasychev on 2012-12-10 14:23:28

  13. Oleg Sychev reporter
    еще 8 - ошибка в тесте, исправляю - если не согласны, пишите!
    

    Reported by oasychev on 2012-12-10 14:33:50

  14. Oleg Sychev reporter
    Что интересно, после исправления теста 13 в фейлах НКА он тоже не появился. Получается,
    он его вообще не проходит? Почему?
    

    Reported by oasychev on 2012-12-12 10:47:29

  15. Oleg Sychev reporter
    От Валерия (почему-то не здесь...)
    
    Я понял, в чем там проблема - worse_than криво срабатывает. Из дебаг-принта:
    
    (0, 1) vs (1, 11)      wins 1     (потому что первое левее)
    
    Это сравнение происходит вроде бы после самой волны. Приложена картинка автомата. Захватив
    первый раз (0, 1) он потом начинает крутиться на b которая без тегов во второй подмаске.
    В самом конце есть переход по пустоте, получились два состояния который сравнивались
    выше. По сути они "соседние", но в подмаске разница в 11 символов. Проблема в том,
    что worse_than оперирует только индексами\длинами и не знает, какое состояние после
    какого стоит - при одинаковых индексах и длинах это сыграло роль. Поэтому надо включать
    эту проверку...
    
    Я возьмусь за это после сдачи - там надо бы весь код в наследник нашего общего автомата
    перенести, добавить всякие функции типа is_reachable для состояний и т.д. Сейчас на
    все это времени нету
    

    Reported by oasychev on 2013-01-21 11:03:04

  16. Valeriy Streltsov
    Правда, появились новые баги из-за введения новых переходов - опять же на worse_than.
    Прикладываю два файлика, их можно легко диффнуть.
    

    Reported by vostreltsov on 2013-01-24 17:26:24

    <hr> * Attachment: old * Attachment: new

  17. Oleg Sychev reporter
    Ну, меня пока устраивает, что новые баги различаются только подмасками, а старые - иногда
    и главным совпадением. Подмаски - меньшее зло, хотя надеюсь на каникулах и это исправиться...
    

    Reported by oasychev on 2013-01-25 06:33:23

  18. Oleg Sychev reporter
    Ну что, мы на каникулах worse_than и различные режимы подмасок в PCRE/POSIX сделаем?
    

    Reported by oasychev on 2013-01-29 13:58:59

  19. Valeriy Streltsov
    Добавил pcre\posix в хэндлер, но фейлов от этого не уменьшилось... Может кстати удалить
    теперь поле $pcrestrict из опций?
    

    Reported by vostreltsov on 2013-02-01 08:26:12

  20. Oleg Sychev reporter
    Ну мне сложно что-то сказать, т.к. во-первых кросс-тестер не настраивает их ориентируясь
    на происхождение тестов, во-вторых - надо смотреть изменились ли связанные с этим делом
    фейлы...
    

    Reported by oasychev on 2013-02-01 20:12:05

  21. Valeriy Streltsov
    Я посмотрел, как себя ведет PCRE на квантификаторах.
    
    В случае "(a)*" vs "aaaaaaaa" в подвыражение будет захвачено a, но если регекс "(a|)*",
    "(a*)*" или подобный - захватится пустота. Посему предлагаю функции nullable, firstpos,
    lastpos и followpos перенести из ДКА-узлов в общие узлы: понадобится всем.
    
    Еще такой момент: поскольку корень дерева это 0-подвыражение, предлагаю аналогично
    полю subpattern сделать поле subexpression в абстрактном узле, и делать его не равным
    -1 только для подвыражений и корня. Таким образом четко будет видна разница между именно
    подвыражением и ссылкой на него (например в обратных ссылках, условных подвыражениях,
    рекурсии). Сейчас во всех подобных узлах поле имеет одно имя - number - что немного
    сбивает с толку. Плюс ко всему, приходится делать динамическое поле number для корня
    или дополнительные выкрутасы в коде для 0-подвыражения.
    

    Reported by vostreltsov on 2013-03-20 18:08:35

  22. Oleg Sychev reporter
    По квантификаторам там все очевидно - если пустоту захватить можно в подмаску, то она
    будет захвачена в конце.
    
    Насчет nullable согласен; насчет остальных - можете предложить вариант, зачем они могут
    быть нужны - особенно followpos? И всегда ли лучше это делать по дереву или автомату?
    Боюсь, с простыми ассертами эти функции не всегда вернут правильное значение...
    
    Последний абзац слишком сложноват для восприятия по тексту, давайте обсудим в четверг.
    

    Reported by oasychev on 2013-03-24 18:23:13

  23. Valeriy Streltsov
    Ну, followpos нужен только для ДКА. У Вилли в кода были вычисления всех этих значений
    для всех операндов, включая даже обратные ссылки.
    

    Reported by vostreltsov on 2013-03-26 07:34:44

  24. Oleg Sychev reporter
    У Вилли - включая followpos? Для обратных ссылок по идее можно определить от соответствующей
    подмаски. А у Вилли можно глянуть, где вычисленные значения используются, по идее поиском
    это несложно...
    

    Reported by oasychev on 2013-03-26 09:37:06

  25. Valeriy Streltsov
    followpos, очевидно, там нет - для NFA он не нужен. Для всех листов (включая обратные
    ссылки и ассерты) followpos и lastpos это i (леворекурсивный номер), как обычно.
    
    У него есть функция tre_make_trans (файл tre-compile.c) которая юзает эти значения.
    

    Reported by vostreltsov on 2013-03-26 09:49:13

  26. Oleg Sychev reporter
    Судя по названию функции она имеет отношение к производству переходов.
    
    Вы качество то кода у Колесова в этих функциях посмотрели?
    

    Reported by oasychev on 2013-03-26 09:50:26

  27. Valeriy Streltsov
    Что значит качество кода? Если вы имеете ввиду что там все плохо, эти функции написать
    - полчаса времени.
    

    Reported by vostreltsov on 2013-03-26 10:29:11

  28. Oleg Sychev reporter
    По вашей наводке было запощено не в то issue, переносим куда надо
    По итогам разговора текущие проблемы средней сложности для решения в ближайшее время:
    
    а) ленивые квантификаторы по PCRE через корректную последовательность перебора "ленивых
    состояний"
    б) не считать совпавшие подмаски мертво фиксированными при генерации продолжения, если
    на них есть обратные ссылки - иногда можно получить меньший left перегенерировав их
    в) сделать наконец  поддержку nullable подмасок в PCRE-режиме
    г) #191 (Сычев) и соответствующие изменения в кросс-тестере (Стрельцов)
    д) #188 
    
    Ну и проблема большей сложности, когда будет больше времени:
    еклмн;) мержинг \b в автомат  
    
    
    Проблема г) решена мной, ждем-с остальные.
    

    Reported by oasychev on 2013-04-25 17:33:13

  29. Valeriy Streltsov
    Сделал поддержку модификаторов imsxD, исправил работу простых ассертов.
    Там есть странный тест: "\Aabc\Z" vs "abc\n " - пробел в конце строки должен обламывать
    совпадение. PCRE так не считает при любых модификаторах. Такое ощущение, что оно всегда
    игнорирует whitespace'ы в конце строки.
    

    Reported by vostreltsov on 2013-05-05 08:19:51

    <hr> * Attachment: test_all_7

  30. Oleg Sychev reporter
    1) Может и игнорировать, whitespace'ы  в начале и конце - тримминг. А через testregex
    проверяли, правда игнорирует? Или может это касается только тестовых файлов, там легко
    его не заметить...
    
    nfa_matcher failed on regex '\A(.)*\Z' string 'abc
    def' and modifiers 'm' (qtype_preg_cross_tests_from_pcre, data_for_test_begin_and_end_of_string_and_any_character_in_quantifier_modifier_m)
    INDEX_FIRST: 0=>0, 1=>2, 
    expected:
    INDEX_FIRST: 0=>0, 1=>0, 
    
    nfa_matcher failed on regex '\A(.)*\Z' string 'abc
    def' and modifiers 'm' (qtype_preg_cross_tests_from_pcre, data_for_test_begin_and_end_of_string_and_any_character_in_quantifier_modifier_m)
    LENGTH:      0=>3, 1=>1, 
    expected:
    LENGTH:      0=>3, 1=>3, 
    Мне кажется ошибка в тесте, поправьте если согласны: подвыражение внутри квантификатора,
    как длина может быть 3? В PCRE вообще no match
    
    2) Вот в этих тестах и следующих аналогичных тоже, возможно, ошибки. 
    nfa_matcher failed on regex '(.*X|^B)' string '*** Failers' and modifiers 's' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_or_begin_of_line_in_alternation_modifier_s)
    INDEX_FIRST: 0=>0, 1=>-1, 
    expected:
    INDEX_FIRST: 0=>0, 1=>0, 
    
    nfa_matcher failed on regex '(.*X|^B)' string '*** Failers' and modifiers 's' (qtype_preg_cross_tests_from_pcre,
    data_for_test_any_character_in_quantifier_or_begin_of_line_in_alternation_modifier_s)
    LENGTH:      0=>11, 1=>-1, 
    expected:
    LENGTH:      0=>11, 1=>11,
    
    
    3)А вот это меня удивляет
    nfa_matcher failed on regex '(abc|)+' and string 'abc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_alternation_in_subexpression_in_quantifier)
    LENGTH:      0=>3, 1=>3, 
    expected:
    LENGTH:      0=>3, 1=>0, 
    Я могу понять, если вы зануление пока не сделали (хотя сделав функцию nullable - странно
    это) - но почему тогда index_first не дает фейла, а только длина? И там дальше много
    аналогичных тестов есть...
    
    4)data_for_test_backslash и data_for_test_backslash_modifier_i - мы вроде когда-то
    в чате обсуждали и к относительно простому пониманию приходили - там толи тесты криво
    переведены, может уже исправить?
    
    5) Regex incorrect - видели? Такого по идее быть не должно, или кривая конвертация
    теста - или наш поиск ошибок не идеален. Сами разберетесь?
    
    6) Вот это меня явно удивляет - здесь тест в в порядке? Не могу представить такого
    index_first, тут же всего один вариант совпасть, мало ли какой ленивый квантификатор...
    nfa_matcher failed on regex '^(b+|a){1,2}?bc' and string 'bbc' (qtype_preg_cross_tests_from_pcre,
    data_for_test_subexpression_and_alternation_and_greedy_and_lazy_quantifiers)
    INDEX_FIRST: 0=>0, 1=>0, 
    expected:
    INDEX_FIRST: 0=>0, 1=>1,
    

    Reported by oasychev on 2013-05-05 13:00:36

  31. Valeriy Streltsov
    1 - pcretest вроде бы ничего не триммит, позже разберусь
    2 - тут действительно ошибка; там nomatch, подвыражения не должны быть захвачены
    3 - была ошибка в тесте, теперь фейлится и index_first :)
    4 - разберусь потом, сделаю кастомный pcretest который будет распечатывать полученные
    plain string'и
    5 - пофиксил, были проблемы в лексере
    6 - пофиксил
    

    Reported by vostreltsov on 2013-05-05 14:10:00

  32. Valeriy Streltsov
    '\A(.)*\Z' исправил, там правда ошибка; при строке abc\n например там будут такие индексы,
    как дает НКА матчер.
    

    Reported by vostreltsov on 2013-05-05 15:57:09

  33. Valeriy Streltsov
    Сделал автоматическое переименование имен функций в тестах pcre, потому что километровые
    названия не помещаются на консоли\трудны для чтения в файле; часть закомментированных
    тестов вообще никак не названа - проще раздать им имена автоматически. Выкладываю текущие
    фейлы в таком виде, чтоб диффать было легче потом.
    
    Кстати, исправил тест a\\b - регекс там был правильный; но в строке \b превращается
    в backspace, а \B вообще неведомым образом превращается в опцию PCRE_NOTBOL (непонятно,
    почему из строки-то?). В итоге в первом случае написал chr(0x08), во втором - просто
    убрал \B, так как он игнорируется как символ. Оба теста прошли.
    

    Reported by vostreltsov on 2013-05-05 20:42:32

    <hr> * Attachment: test_all_11

  34. Oleg Sychev reporter
    Мне очень не нравится что не реализован пункт
    б) не считать совпавшие подмаски мертво фиксированными при генерации продолжения, если
    на них есть обратные ссылки - иногда можно получить меньший left перегенерировав их
    
    Это никак не вопрос совместимости с PCRE. Это вопрос наших алгоритмов генерации при
    обратных ссылках - прямая часть нашей работы, и пока проблема не выправлена заявлять
    о хорошей поддержке обратных ссылок мы не можем вообще-то.  Я бы, кстати, вынес итоговый
    алгоритм в доклад на конкурс/защиту.
    

    Reported by oasychev on 2013-05-06 06:19:00

  35. Valeriy Streltsov
    Сделать, в принципе, можно. Будет только проблема с потреблением памяти и скоростью
    - сами понимаете, что нужно последовательно запоминать прошлые переходы и откатываться
    один за другим. Причем совершенно непонятен критерий, когда откаты останавливать. Ведь
    в тесте
    
    nfa_matcher failed on regex '^(cow|)\1(bell)' and string 'cowbell' (qtype_preg_cross_tests_from_pcre,
    data_for_test_78)
    LEFT:        7
    expected:
    LEFT:        4
    
    продолжение сгенерировалось, но для того, чтобы сделать 4 символа, нужно откатиться
    на самое начало.
    

    Reported by vostreltsov on 2013-05-06 09:39:25

  36. Oleg Sychev reporter
    Я думаю что ответ достаточно тривиален: откатываться надо к началу каждой подмаски,
    на которую имеется обратная ссылка....
    

    Reported by oasychev on 2013-05-06 12:19:15

  37. Valeriy Streltsov
    Хорошее предложение, займусь.
    

    Reported by vostreltsov on 2013-05-06 12:27:53

  38. Valeriy Streltsov
    Сделал проверку пустой последней итерации внутри leftmost_longest в режиме PCRE; фейлов
    немного убавилось. Также исправил пару ошибок в тестах, подробнее см. в коммитах.
    

    Reported by vostreltsov on 2013-05-07 17:34:06

    <hr> * Attachment: test_all_12

  39. Valeriy Streltsov
    И еще исправил несколько ошибок в тестах с nullable подвыражениями. Теперь очевидных
    ошибок в фейлах вроде бы нет.
    

    Reported by vostreltsov on 2013-05-07 18:05:34

    <hr> * Attachment: test_all_13

  40. Valeriy Streltsov
    Причина фейла в тесте regex '^(cow|)\1(bell)' and string 'cowbell' - фунция is_match().
    В данном тесте чтобы все было хорошо нужно откатиться на length = 0, но при этом получается
    is_match() == false, и выигрышный вариант откидывается в worse_than, даже если он туда
    и попадёт.
    
    Кстати, в текущей функции is_match() лишняя проверка isset($this->length[0]) - оно
    всегда гарантировано существует.
    

    Reported by vostreltsov on 2013-05-08 19:27:31

  41. Oleg Sychev reporter
    По результатам разговора: необходимо доработать кросс-тестер на случай "отката" матчером
    от совпадения так, чтобы были два вида данных для проверки - один по совпадению, другой
    - по сгенерированному продолжению. Ситуации эти в кросс-тестере можно определить по
    тому, что extensionstart в основном объекте не совпадает с суммой индекса начала и
    длины совпадения...
    
    Соответственно в результатах матчинга в основном объекте возвращаем более длинное совпадение,
    а в продолжении делаем "откат". Код для этого в классе результатов матчинга предусмотрен.
     Вопрос только, надо ли отображать "откат" зачеркиванием этого куска ответа студенту,
    или просто продолжить с более ранней позиции?
    

    Reported by oasychev on 2013-05-10 21:53:15

  42. Oleg Sychev reporter
    Еще мне непонятны причины фейлов в тестах ПЦРЕ 284, 285 и 748 
    В чем там дело?
    
    Надеюсь код про откат увидеть побыстрее, т.к. мне и самому надо проверить вопрос на
    поведение в этом случае...
    

    Reported by oasychev on 2013-05-11 16:01:07

  43. Valeriy Streltsov
    Теперь вот так. Появились фейлы с откатом при частичных совпадениях, например, (a|b\1),
    потому что сейчас нка уже не юзает worse_than. Как раз случай, когда надо захватить
    максимум, но для подсказки откатиться назад.
    
    На EXCEPTIONS: 1 не обращайте внимания, это проблема в одном тесте - php переводит
    escape-последовательности в ascii символы, а не в юникод. Это я пофикшу наверное в
    самом тесте.
    

    Reported by vostreltsov on 2013-06-28 09:10:26

    <hr> * Attachment: test_all_14

  44. Oleg Sychev reporter
    Мне не нравятся некоторые из новых фейлов. Такое впечатление, что сейчас она ставит
    приоритет подшаблонов над всем - даже полным совпадением, лишь бы побольше в первую
    .* захватить.
    
    Как планируете с этим бороться?
    

    Reported by oasychev on 2013-07-02 11:25:10

  45. Valeriy Streltsov
    Скажите конкретный фейл; полное совпадение это тоже подшаблон.
    

    Reported by vostreltsov on 2013-07-02 11:58:06

  46. Valeriy Streltsov
    Что делать с отрицательным left при откатах? Мне кажется, что оно вполне логично; можно
    и оставить.
    

    Reported by vostreltsov on 2013-07-06 08:04:35

  47. Valeriy Streltsov
    Или считать его как длину сгенерированного next, всегда положительным?
    

    Reported by vostreltsov on 2013-07-06 08:19:53

  48. Oleg Sychev reporter
    С откатами проблемы решены? Может тогда новый файлик приложите?
    

    Reported by oasychev on 2013-07-09 12:34:09

  49. Valeriy Streltsov
    Теперь вот так. Смотрите также коммиты, где я добавлял индексы\длины продолжения совпадения
    в тесты.
    

    Reported by vostreltsov on 2013-07-11 08:50:12

    <hr> * Attachment: test_all_15

  50. Oleg Sychev reporter
    Как-то непохоже, что все возвраты нормально работают и регрессии устранены.
    Посмотрите например на 
    nfa_matcher failed on regex '^.+[0-9][0-9][0-9]$' and string '123' (qtype_preg_cross_tests_from_pcre,
    data_for_test_21):
    LEFT:            3
    expected:
    LEFT:            1
     и т.д.
    

    Reported by oasychev on 2013-07-12 08:54:34

  51. Valeriy Streltsov
    Там есть ряд тестов (в том числе и этот), где при выборе совпадения выигрывает неправильное
    с точки зрения генерации продолжения. По leftmost longest оно правильное, точка всё
    съела и осталось три [0-9]. Я пока думаю, что с этим делать.
    

    Reported by vostreltsov on 2013-07-12 10:07:20

  52. Valeriy Streltsov
    Откаты, кстати, были призваны решить немного другую проблему - с обратными ссылками
    на пропущенные подвыражения, например.
    

    Reported by vostreltsov on 2013-07-12 10:10:11

  53. Oleg Sychev reporter
    leftmost делаем только при кросс-тестировании по тестам at&t/pcre (если надо), в режиме
    вопроса (и наши собственные тесты from_preg должны быть так же устроены - нужно дописать
    1-2 именно на эту ситуацию, чтобы не иметь проблем) - выбираем лучший по left и длине;
    соответствующую опцию сделать в опциях матчинга
    
    В итоге должны остаться фейлы на сложных ситуациях с ленивыми квантификаторами и простых
    ассертах, остальные уйти...
    

    Reported by oasychev on 2013-07-12 14:27:51

  54. Valeriy Streltsov
    Такие фейлы были в preg 2.5 release. Выкладываю для удобства последующих диффов, так
    как добавился индекс -2 и убрался какой-то фейл.
    

    Reported by vostreltsov on 2013-11-08 18:12:53

    <hr> * Attachment: test_all_16

  55. Valeriy Streltsov
    data_for_test_668 - фейлится из-за worse_than, который не по posix\pcre
    
    data_for_test_741 - там что-то с откатом, видимо. поправлю
    
    data_for_test_754, data_for_test_755 фейлится из-за worse_than
    
    data_for_test_835 - тут вообще у pcre странное поведение; оно должно бы сматчиться
    за две итерации (ведь pcre же делает обычно одну лишнюю, да?). явное указание {2} заставляет
    PCRE работать так же, как и наш матчер. как заставить НКА работать как PCRE пока что
    непонятно :)
    
    Остальное фейлится из-за ассертов\ленивости\непонятно чего
    

    Reported by vostreltsov on 2013-11-09 14:29:06

    <hr> * Attachment: test_all_17

  56. Valeriy Streltsov
    Есть категория фейлов с частичными совпадениями и ленивыми квантификаторами.
    Простейший пример: a+?b и aaaaaa
    По логике вещей должно быть частичное совпадение "а", но алгоритм видит, что "а" не
    дает полного и идёт к следующему символу.
    
    Просматривать все символы придется в любом случае. Похоже, нужно завести еще одно поле
    со счетчиком лениво захваченных переходов и учитывать его в leftmost longest?
    

    Reported by vostreltsov on 2013-11-09 14:46:03

  57. Valeriy Streltsov
    После добавления условных подвыражений пока что так.
    

    Reported by vostreltsov on 2013-11-10 12:21:23

    <hr> * Attachment: test_all_18

  58. Valeriy Streltsov
    И предлагаю уже убрать фейлящийся тест на якорение ".*"
    
    Если .* считать якорением, появляется такой фейл:
    
    nfa_matcher failed on regex '(.*)\d+\1' string 'abc123bc' and modifiers 's' (qtype_preg_cross_tests_from_pcre,
    data_for_test_616):
    FULL:            FALSE
    INDEX_FIRST:     -2=>-1, 0=>0, 1=>0, 
    LENGTH:          -2=>-1, 0=>8, 1=>8, 
    expected:
    FULL:            TRUE
    INDEX_FIRST:     0=>1, 1=>1, 
    LENGTH:          0=>7, 1=>2, 
    

    Reported by vostreltsov on 2013-11-10 13:57:20

  59. Oleg Sychev reporter
    Я уже постил на трекер цитату из pcre.txt, описывающую точные условия при которые .*
    является якорением. Сколько раз мне это надо сделать, чтобы вы перестали пытаться 
    прибить его вообще, а запрограммировали по нормальному?!
    

    Reported by oasychev on 2013-11-10 17:29:01

  60. Valeriy Streltsov
    Фейлы, ушедшие исправлениями матчера:
    (qtype_preg_cross_tests_from_pcre, data_for_test_210)
    (qtype_preg_cross_tests_from_pcre, data_for_test_662)
    
    Остальные - исправления ошибок.
    
    Фейл (qtype_preg_cross_tests_from_pcre, data_for_test_668) происходит в вашем коде,
    там left не дает выбрать самое левое совпадение. Что мы будем делать с такого рода
    фейлами?
    

    Reported by vostreltsov on 2014-01-11 19:41:09

    <hr> * Attachment: test_all_20

  61. Oleg Sychev reporter
    А чего в 668 лефт не дает выбрать самое левое? Это опять проблемы типа теста 371 - неидеальная
    генерация. Потому что если не глядеть на автомат и квантификаторы, а следовать логике
    регекса, то лефт должен быть одинаковым что с 0 девять символов совпало, что с единицы
    восемь - какая разница? Лефт зависит от того, воспринялась ли последняя "о" в совпадении
    как очередная точка или как [op], но уж никак не может зависеть от точки начала совпадения
    - что-то тут нечисто.
    
    253 - по-моему next в данном случае [ab] - оба символа дают одинаковый лефт; если согласны
    - исправьте.  (Вы хотите чтобы я проверил все фейлы с условными подмасками, или сами
    займетесь?)
    
    163 - посмотрите, в чем там проблема - без дополнительных данных смысл разницы EXT_LENGTH
    я не понимаю
    
    И наконец вопрос с корректной обработкой при обломе совпадения на долларе - по идее,
    если получается ends_there то надо ставить нулевую лефт и вообще не пытаться ничего
    генерировать, правильно? Там в чем проблема - ассерт пока не возвращает что надо или
    алгоритм генерации этого не учитывает? Если первое, можно попробовать Лепилкину подтолкнуть,
    второе - вам надо работать. Тесты типа 565, 136 и 26 фейлятся вроде бы по этой причине...
    

    Reported by oasychev on 2014-01-11 21:22:27

  62. Valeriy Streltsov
    668: с позиции 0 там лефт 2, а с позиции 1 - 1, так как символ "o" уже есть в строке
    

    Reported by vostreltsov on 2014-01-11 22:26:19

  63. Valeriy Streltsov
    668: разница в том, что с позиции 0 ему нужно сгенерировать потом 2 символа, а с позиции
    1 при генерации .* пропускается, "o" уже был в строке - остается 1 символ
    

    Reported by vostreltsov on 2014-01-11 22:32:05

  64. Oleg Sychev reporter
    668 - установили что нет, проблема в генерации
    

    Reported by oasychev on 2014-01-11 22:48:12

  65. Oleg Sychev reporter
    584 первый тест - странное поведение матчера. Он выбирает не захватывать кавычку в первое
    подвыражение (которое под квантификатором ?), что приводит к более короткому совпадению,
    чем если бы он захватил. Видимо ваш leftmost longest не учитывает условных подмасок...
    Я так понимаю, если для подвыражения есть условная подмаска, мы должны оставить два
    варианта "лучших" состояний для него если они есть - с захваченным подвыражением и
    с незахваченным.
    

    Reported by oasychev on 2014-01-12 23:25:33

  66. Valeriy Streltsov
    В некоторых тестах с ленивыми квантификаторами были ошибки, а для некоторых пришлось
    найти и исправить ошибку в матчере
    

    Reported by vostreltsov on 2014-01-13 09:21:44

    <hr> * Attachment: test_all_21

  67. Oleg Sychev reporter
    Так что у нас все-таки с 668? Странная проблема, при одинаковом left должен выигрывать
    Longest по идее, а не выигрывает...
    

    Reported by oasychev on 2014-01-16 16:43:17

  68. Valeriy Streltsov
    >> 668 - установили что нет, проблема в генерации
    

    Reported by vostreltsov on 2014-01-16 21:07:12

  69. Valeriy Streltsov
    Фейлы qtype_preg_cross_tests_from_preg, data_for_test_uprops_and_posix_negative_negative
    вроде бы ненастоящие, Лена что-то сломала сегодня - починим
    

    Reported by vostreltsov on 2014-03-23 20:29:37

    <hr> * Attachment: test_all_22

  70. Oleg Sychev reporter
    data_for_test_26 и data_for_test_136 и 565 - проблемы в тестах, матчер умнее; только
    вывод осмысленных сообщений в кросс-тестере при возврате спец-констант надо бы доделать
    
    253 уже обсуждался - пора править тест
    668 - очень странно, если начинается с .* - почему index_first не 0? Оно ж вообще заякоренное...
    129 тоже очень странно
    

    Reported by oasychev on 2014-03-23 21:27:38

  71. Valeriy Streltsov
    Апдейт, часть фейлов ушла, появились новые из новых тестов
    

    Reported by vostreltsov on 2014-11-22 10:49:00

  72. Oleg Sychev reporter
    Валерий, по текущему состоянию кода - имеет ли смысл рассматривать/лечить фейлы отдельно
    от Лениного кода? Потому что оно может меняться. Или уже имеет смысл наладить его вызов
    через settings.php и параметры кросс-тестинга, и уже интегрировать/отлаживать совместно?
    

    Reported by oasychev on 2014-11-22 12:58:19

  73. Valeriy Streltsov
    Тут 3 категории фейлов
    1) с ассертами, тут без Лены ничего не заработает
    2) решаемые проблемы с пцре-совместимостью, такие как обратные ссылки на дублированные
    подвыражения
    3) нерешаемые проблемы с пцре-совместимостью - особые случаи ленивости, например
    
    на данный момент я больше это фиксить не буду, а займусь рекурсией. но из этого списка
    в первую очередь можно делать 2) независимо от Лены
    

    Reported by vostreltsov on 2014-11-22 13:04:49

  74. Oleg Sychev reporter
    1) на данный момент надо, в первую очередь, как мы говорили, пофиксить кросс-тестер
    так чтобы были тесты с двумя возможными возвратными точками облома - одна по положению
    ассерта, другая - по переходу где он смержился. Это возможно сейчас уже? И заодно реализовать
    человеческое подключение кода Лены через настройку в settings.php (и в кросс-тестере,
    ибо для него конфиг отдельный).
    2) я что-то не понял про удаление next/left в переведенных тестах. Их править а не
    удалять надо по хорошему. Для testinput1 Бондаренко вроде это делал...
    

    Reported by oasychev on 2014-11-22 15:54:35

  75. Valeriy Streltsov
    Вы видимо забыли. То что писал Бондаренко осталось и находится в cross_tests_from_pcre.
    Там остались все тесты на частичные совпадения.
    
    testinput1 и testinput4 сейчас генерируются полностью автоматически. первый пересекается
    с тестами от Бондаренко только пустыми совпадениями
    
    я все-таки думаю, что то, что генерируется автоматически, не нужно руками трогать
    

    Reported by vostreltsov on 2014-11-22 16:16:39

  76. Valeriy Streltsov
    fa_matcher failed on regex '(?:(?<n>foo)|(?<n>bar))\k<n>' string 'barbar' and modifiers
    'J' (qtype_preg_cross_tests_from_pcre_testinput1, data_for_test_1092):
    FULL:            FALSE
    LENGTH:          0=>3, 1=>-1, 2=>3, 
    expected:
    FULL:            TRUE
    LENGTH:          0=>6, 2=>3, 
    
    Есть идеи как фиксить? Одному имени соответствуют два номера...
    

    Reported by vostreltsov on 2014-11-26 16:33:30

  77. Valeriy Streltsov
    Это пофиксил + была пара ошибок в тестах. Теперь остались только сложные случаи
    

    Reported by vostreltsov on 2014-11-26 20:37:15

    <hr> * Attachment: test_all_24

  78. Valeriy Streltsov
    Теперь с реализованной рекурсией. Генерация вроде бы тоже работает.
    

    Reported by vostreltsov on 2014-11-30 08:38:59 - Status changed: InProgress

    <hr> * Attachment: test_all_25

  79. Valeriy Streltsov
    data_for_test_770 - матчер прав, что там нужно удалить всё кроме первого символа? Я
    проверил, что он генерирует и скобку в конец строки, но первый вариант вроде бы короче.
    

    Reported by vostreltsov on 2014-11-30 08:41:53

  80. Valeriy Streltsov
    Хотя такое поведение матчера на данный момент было багом; по-хорошему оно достижимо
    только с помощью откатов. Будем делать откаты к началу рекурсивных вызовов?
    

    Reported by vostreltsov on 2014-11-30 13:12:35

  81. Valeriy Streltsov
    Сейчас рекурсия уже вроде довольно неплохо отлажена, можно обсудить фейлы от Бондаренковского
    pcre набора.
    

    Reported by vostreltsov on 2014-12-01 11:34:59

    <hr> * Attachment: test_all_26

  82. Oleg Sychev reporter
    data_for_test_770 - я не понимаю как удалось получить left=0 при тех же данных по совпадению,
    тут надо подробнее смотреть как она предлагает обрезать совпадение - до "а" что ли?
    
    * может кросс-тестеру при расхождениях next/left печатать также сгенерированную строку?
    было бы намного понятнее...
    
    data_for_test_772 - вся строка совпала при постоянных рекурсиях? но тогда второе или
    четвертое подвыражение по крайней мере должны были бы совпадать вроде. Или он на последнем
    шаге рекурсии вдруг выбрал самую последнюю точку? Но и она организовала бы совпадение
    с подвыражением, только уже третьим по идее.
    
    data_for_test_774 - в первом фейла опять надо смотреть сгенерированную строку.
    data_for_test_786 - аналогично по обоим фейлам, ибо без понятия о том с какого отката
    она пошла перегенерировать ничего понять нельзя
    

    Reported by oasychev on 2014-12-01 19:25:39

  83. Valeriy Streltsov
    770 - ошибка в тесте.
    772 - баг в матчере, исправлено.
    
    остальное не трогал, добавил вывод сгенерированной строке.
    

    Reported by vostreltsov on 2014-12-01 20:19:51

    <hr> * Attachment: test_all_27

  84. Valeriy Streltsov
    774:
    на первой строке матчер точно прав
    на второй тоже вроде прав. в рекурсивном вызове через {2} захватывается xyzxyz, на
    нулевом уровне не хватает единственной z.
    
    786:
    подобные частичные совпадения похоже встречаются много где. тут матчер прав. ну и откатиться
    к началу чтобы r или t пошла по правой ветке альтернативы вроде наиболее коротко.
    

    Reported by vostreltsov on 2014-12-01 20:40:43

  85. Valeriy Streltsov
    Вот автомат для 163, я правда сделал {30} вместо {300}, сути не меняет.
    Оно не откатывается никуда кроме состояния 0.
    

    Reported by vostreltsov on 2014-12-01 21:13:33

    <hr> * Attachment: 163.svg

  86. Oleg Sychev reporter
    Лена, обратите внимание на малозаметные сообщения в тестах
    Regex incorrect: [\]<br/>Syntax error: missing a closing bracket ']' for the character
    set starting in position 0.
    Regex incorrect: [()+?*\]+<br/>Syntax error: missing a closing bracket ']' for the
    character set starting in position 0.
    Regex incorrect: )<br/>Syntax error: missing opening parenthesis '(' for the closing
    parenthesis in position 0.
    Там с экранированием криво, поправьте регексы...
    

    Reported by oasychev on 2014-12-17 23:19:00

  87. Valeriy Streltsov
    Не стоит этого делать если это АТТ тесты.я поправлю конвертер с этим частным случаем
    

    Reported by vostreltsov on 2014-12-18 00:06:40

  88. Former user Account Deleted
    Все-таки до сих пор остается открытым вопрос для случаев, когда \b создает тупиковый
    автомат. С генерацией понятно, а вот с частичным совпадением нет.
    Сейчас тесты написаны так, что до тупикового перехода должно совпадать. Эти тесты фейлятся.
    Как править? Оставлять пустой автомат, или поддерживать частичные совпадаения. Тесты
    по типу
    fa_matcher failed on regex 'a\bc' and string 'ac' (qtype_preg_cross_tests_from_preg_merging,
    data_for_test_assertions_wordboundary_3):
    IS_MATCH:        FALSE
    INDEX_FIRST:     0=>-1, 
    LENGTH:          0=>-1, 
    expected:
    IS_MATCH:        TRUE
    INDEX_FIRST:     0=>0, 
    LENGTH:          0=>1, 
    

    Reported by eklepilkina on 2014-12-18 20:55:39

  89. Oleg Sychev reporter
    Насчет чьи тесты - при ошибках в регексе кросс-тесты к сожалению не выводят откуда тесты,
    можно только по положению гадать.
    
    Про тесты с разными ответами совпадения при тупиках в автомате и без них, мы вроде
    обсуждали в среду с Валерием и решили сделать в кросс-тестере два варианта ответов,
    в зависимости от режима. Ждем-с, когда эта возможность будет реализована в кросс-тестере,
    тут главный Валерий.
    
    Кстати, Валерий, предлагаю при проверке на рекурсию в каждом узле, двигаясь с которого
    рекурсия неизбежна, прописывать дополнительно узел ближайшей развилки, позволяющей
    ее обойти. Или просто проставлять признак "рекурсия впереди неизбежна". Это несложно
    совместить с поиском новых ошибок. Тогда обсуждавшуюся в среду проблему откатов при
    наличии рекурсии в ветке после длинной конкатенации можно будет легко решить.
    

    Reported by oasychev on 2014-12-18 22:01:25

  90. Valeriy Streltsov
    Вроде стало лучше, но чего-то стали фейлиться тесты preg типа $b, они раньше проходили.
    

    Reported by vostreltsov on 2015-01-29 12:26:49

    <hr> * Attachment: test_all_30

  91. Former user Account Deleted
    С мержингом $b проходит.
    А без мержинга bisect сказал, что это ты что-то сломал в этом коммите.
    Первая плохая ревизия:
    набор изм-й:   4165:a67a2df23b0c
    автор:         Valeriy Streltsov
    дата:          Thu Dec 18 21:20:03 2014 +0000
    сводка:        Перевел волну на использование NEXT_CHAR_XXX
    

    Reported by eklepilkina on 2015-01-30 06:30:42

  92. Oleg Sychev reporter
    Лена - обратите внимание на qtype_preg_cross_tests_from_preg_merging, data_for_test_assertions_modifier_12
    - там какой-то явный бред генерируется... И это ваш код с мержингом.
    

    Reported by oasychev on 2015-02-24 22:24:20

  93. Oleg Sychev reporter
    Лена - насчет qtype_preg_cross_tests_from_preg_merging, data_for_test_assertions_modifier_12
    - или теперь qtype_preg_cross_tests_from_preg_merging, data_for_test_assertions_tags_10.
    Сейчас она так себя ведет скорее всего из-за несовершенства откатов, но дорабатывать
    их в данном случае не нужно. Поскольку Валерий доработал кросс-тестер и вы теперь можете
    прописать две копии строки с разными результирующими данными в зависимости от наличия
    мержинга, пора реализовать полностью идею фейлов в том месте, откуда надо переписывать
    совпадение. Т.е. в данном случае при мержинге [a-z0-9\n] и ^ от символьного класса
    должен остаться только \n, все остальные варианты она должна удалить. А если там нет
    \n - то вообще разорвать такой переход и удалить "висячую" ветку.
    

    Reported by oasychev on 2015-02-25 09:02:47

  94. Oleg Sychev reporter
    Лена - да, естественно это все реализуется в момент мержинга автомата
    

    Reported by oasychev on 2015-02-25 09:12:02

  95. Valeriy Streltsov
    Технически - я так понимаю, что нужно для главного узла перехода вызывать ranges() и
    если там нет \n (проверяется функцией в preg_unicode, что-то вроде is_in_ranges) а
    в переход смержен например ^, то убивать такой переход.
    
    Переходы с обратными ссылками, наверное, оставляем.
    

    Reported by vostreltsov on 2015-02-25 11:53:09

  96. Oleg Sychev reporter
    Точнее нужно пересекать переход с \n если это ^ или $ - и результат либо пустой (тогда
    убивается), либо непустой....
    

    Reported by oasychev on 2015-02-25 14:09:11

  97. Valeriy Streltsov
    Теперь вот так.
    Кросс-тестер теперь сообщает есть ли мёржинг в тесте. Во втором файле может возникнуть
    небольшая путаница, потому что я принудительно включал мержинг и не нужно верить тому
    что написано.
    

    Reported by vostreltsov on 2015-02-26 16:11:20

    <hr> * Attachment: test_all_32 * Attachment: test_all_32_merged

  98. Former user Account Deleted
    Олег Александрович, от меня еще что-то надо?
    В файле с моими тестами падает 20, я про него писала в 232 issue и все вроде. Мне нужно,
    чтобы Вы или Валера его посмотрели
    Исключение я добавила,Валера сказал, что в вопрос он сам добавит.
    

    Reported by eklepilkina on 2015-02-26 16:32:37

  99. Oleg Sychev reporter
    Значит правим пять фейлов которые без мержинга не работают так, чтобы без мержинга не
    запускались и разбираемся с 1117, тогда можно и ставить Fixed. Пусть чуток в нем побудет...
    

    Reported by oasychev on 2015-02-28 23:03:17

  100. Valeriy Streltsov
    Для 1117 нужно помнить 1:N соответствия <имя подвыражения>:<номер сабпаттерна>, а у
    нас это сейчас 1:1 по последнему пройденному.
    
    В pcre.txt написано, что J используется когда точно известно, что совпадет только одно
    из именованных подвыражений, хотя тест ровно на противоположный случай - обратные ссылки
    там проверяют на соответствие и одному, и другому именованному подвыражению.
    
    Предлагаю не переделывать все интерфейсы для этой фигни, это ведь скорее всего даже
    прег ноды затронет, а польза от этого нулевая.
    

    Reported by vostreltsov on 2015-03-01 08:35:50

  101. Oleg Sychev reporter
    У меня есть большое подозрение что добавленное вчера условие должно быть не $result->indexfirst[0]
    === $i а result->indexfirst[0] <= $i  - особенно для верхнего цикла, который прибавляет
    не по 1, но и для нижнего тоже не повредит. Иначе если мы случайно пропустим проверку,
    цикл пойдет до конца...
    

    Reported by oasychev on 2015-03-01 10:02:04

  102. Log in to comment