Ошибки от PCRE

Issue #131 resolved
Oleg Sychev repo owner created an issue

Originally reported on Google Code with ID 131

Полный перечень ошибок от PCRE

1  \ at end of pattern
          2  \c at end of pattern
          3  unrecognized character follows \
          4  numbers out of order in {} quantifier
          5  number too big in {} quantifier
          6  missing terminating ] for character class
          7  invalid escape sequence in character class
          8  range out of order in character class
          9  nothing to repeat
         10  [this code is not in use]
         11  internal error: unexpected repeat
         12  unrecognized character after (? or (?-
         13  POSIX named classes are supported only within a class
         14  missing )
         15  reference to non-existent subpattern
         16  erroffset passed as NULL
         17  unknown option bit(s) set
         18  missing ) after comment
         19  [this code is not in use]
         20  regular expression is too large
         21  failed to get memory
         22  unmatched parentheses
         23  internal error: code overflow
         24  unrecognized character after (?<
         25  lookbehind assertion is not fixed length
         26  malformed number or name after (?(
         27  conditional group contains more than two branches
         28  assertion expected after (?(
         29  (?R or (?[+-]digits must be followed by )
         30  unknown POSIX class name
         31  POSIX collating elements are not supported
         32  this version of PCRE is compiled without UTF support
         33  [this code is not in use]
         34  character value in \x{...} sequence is too large
         35  invalid condition (?(0)
         36  \C not allowed in lookbehind assertion
         37  PCRE does not support \L, \l, \N{name}, \U, or \u
         38  number after (?C is > 255
         39  closing ) for (?C expected
         40  recursive call could loop indefinitely
         41  unrecognized character after (?P
         42  syntax error in subpattern name (missing terminator)
         43  two named subpatterns have the same name
         44  invalid UTF-8 string (specifically UTF-8)
         45  support for \P, \p, and \X has not been compiled
         46  malformed \P or \p sequence
         47  unknown property name after \P or \p
         48  subpattern name is too long (maximum 32 characters)
         49  too many named subpatterns (maximum 10000)
         50  [this code is not in use]
         51  octal value is greater than \377 in 8-bit non-UTF-8 mode
         52  internal error: overran compiling workspace
         53  internal error: previously-checked referenced subpattern
               not found
         54  DEFINE group contains more than one branch
         55  repeating a DEFINE group is not allowed
         56  inconsistent NEWLINE options
         57  \g is not followed by a braced, angle-bracketed, or quoted
               name/number or by a plain number
         58  a numbered reference must not be zero
         59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
         60  (*VERB) not recognized
         61  number is too big
         62  subpattern name expected
         63  digit expected after (?+
         64  ] is an invalid data character in JavaScript compatibility mode
         65  different names for subpatterns of the same number are
               not allowed
         66  (*MARK) must have an argument
         67  this version of PCRE is not compiled with Unicode property
               support
         68  \c must be followed by an ASCII character
         69  \k is not followed by a braced, angle-bracketed, or quoted name
         70  internal error: unknown opcode in find_fixedlength()
         71  \N is not supported in a class
         72  too many forward references
         73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)

Необходимо разобраться, какие из них к нам относятся и реализовать выдачу сообщений.
А также что реализовано, а что - нет...

Reported by oasychev on 2012-07-19 15:49:05

Comments (16)

  1. Valeriy Streltsov

    ``` Квадратными скобками выделено то, что реализовано, кое-где написал комментарии каким образом. Вроде бы оставил только то, что необходимо.

    1 \ at end of pattern 2 \c at end of pattern [4] numbers out of order in {} quantifier [6] missing terminating ] for character class [8] range out of order in character class [9] nothing to repeat (странно, у нас это как раз ситуация с квантификатором?) 12 unrecognized character after (? or (?- [14] missing ) 15 reference to non-existent subpattern 17 unknown option bit(s) set [22] unmatched parentheses 25 lookbehind assertion is not fixed length 26 malformed number or name after (?( (можно будет сделать потом, с условными подмасками) [27] conditional group contains more than two branches 28 assertion expected after (?( 29 (?R or (?[+-]digits must be followed by ) [30] unknown POSIX class name [31] POSIX collating elements are not supported 35 invalid condition (?(0) (опять же TODO - условные подмаски) [46] malformed \P or \p sequence [47] unknown property name after \P or \p [58] a numbered reference must not be zero (в правиле в лексере первая цифра числа - [1-9]) [59] an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) (сделано как нераспознанная последовательность) [60] (*VERB) not recognized (сделано как нераспознанная последовательность) [66] (*MARK) must have an argument (сделано как нераспознанная последовательность) [68] \c must be followed by an ASCII character (пока что в виде исключения)

    ```

    Reported by `vostreltsov` on 2012-07-21 07:00:42

  2. Oleg Sychev reporter

    ``` 1, 2 и 15 нужно более чем. На 15 даже тесты в AT&T есть...

    3 и 7 - по PCRE любой не буквенно-цифровой символ после бэкслеш это он сам, а вот буквы - только те, которые актуально используются в последовательностях. Так что по идее это тоже наши ошибки, на случай если там что-то нехорошее. Причем вовне и внутри символьных классов они разные (например внутри симв. классов не могут встречаться обратные ссылки начинающиеся с бэкслеша).

    13 - ошибка, а у нас будет разобрана как куча символов. Может ради совместимости сделать ошибку? Тут они впереди нас...

    18 у нас не идет по общим правилам как незакрытая скобка? Что будет при незакрытом комменте - проверить!

    24 - к нам относится ИМХО. 34 - тоже вполне возможная ошибка, пределы то есть 37 - мы все это поддерживаем или почему ее нет в списке? 38-39 что такое (?C и поддерживается ли оно лексером? 40 - надо бы на будущее, хотя определить ее не так легко. Вокруг рекурсии всегда должен быть обход без нее, либо она под квантификатором допускающим нулевое количество раз должна стоять.... 43 точно возможная ошибка которую надо искать - вы же делали именнованные подмаски, насчет 42 надо посмотреть - видимо тоже... 57 - \g - обратные ссылки,тоже надо выводить бы 63 - (?+ - лексером разбирается? что делает? 65 - это не ситуация когда внутри (?| находятся именованные подмаски? 69 - \k это вроде обратные ссылки , почему нет в списке? 71 - поддерживаем? или мы сделаем по своему?

    ```

    Reported by `oasychev` on 2012-07-23 13:46:35

  3. Oleg Sychev reporter

    ``` Вы напишите новый вариант, что реализовано? ```

    Reported by `oasychev` on 2012-07-31 14:10:50

  4. Valeriy Streltsov

    ``` Обновленный вариант. Внутри [] - то что сделано, внутри () - что по моему мнению к нам не относится. Внизу комментарии.

    [01] \ at end of pattern [02] \c at end of pattern [03] unrecognized character follows \ [04] numbers out of order in {} quantifier [05] number too big in {} quantifier [06] missing terminating ] for character class [07] invalid escape sequence in character class [08] range out of order in character class [09] nothing to repeat (10) [this code is not in use] (11) internal error 12 unrecognized character after (? or (?- [13] POSIX named classes are supported only within a class [14] missing ) [15] reference to non-existent subpattern (16) erroffset passed as NULL (17) unknown option bit(s) set [18] missing ) after comment (19) [this code is not in use] [20] regular expression is too large (21) failed to get memory [22] unmatched parentheses (23) internal error 24 unrecognized character after (?< 25 lookbehind assertion is not fixed length [26] malformed number or name after (?( [27] conditional group contains more than two branches 28 assertion expected after (?( [29] (?R or (?[+-]digits must be followed by ) [30] unknown POSIX class name [31] POSIX collating elements are not supported (32) this version of PCRE is compiled without UTF support (33) [this code is not in use] (34) character value in \x{...} sequence is too large (35) invalid condition (?(0) 36 \C not allowed in lookbehind assertion 37 PCRE does not support \L, \l, \N{name}, \U, or \u 38 number after (?C is > 255 [39] closing ) for (?C expected 40 recursive call could loop indefinitely [41] unrecognized character after (?P [42] syntax error in subpattern name (missing terminator) [43] two named subpatterns have the same name (44) invalid UTF-8 string (specifically UTF-8) (45) support for \P, \p, and \X has not been compiled [46] malformed \P or \p sequence [47] unknown property name after \P or \p (48) subpattern name is too long (maximum 32 characters) (49) too many named subpatterns (maximum 10000) (50) [this code is not in use] (51) octal value is greater than \377 in 8-bit non-UTF-8 mode (52) internal error (53) internal error 54 DEFINE group contains more than one branch 55 repeating a DEFINE group is not allowed (56) inconsistent NEWLINE options [57] \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number [58] a numbered reference must not be zero [59] an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) [60] (*VERB) not recognized (61) number is too big [62] subpattern name expected [63] digit expected after (?+ (64) ] is an invalid data character in JavaScript compatibility mode [65] different names for subpatterns of the same number are not allowed [66] (*MARK) must have an argument (67) this version of PCRE is not compiled with Unicode property support [68] \c must be followed by an ASCII character [69] \k is not followed by a braced, angle-bracketed, or quoted name (70) internal error: unknown opcode in find_fixedlength() (71) \N is not supported in a class (72) too many forward references 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) (74) invalid UTF-16 string (specifically UTF-16)

    03 и 07: сделал такую ошибку вне символьного класса - имхо, внутри СК любой эскейпеный символ кроме специальных удобнее считать самим собой; 59: распознается как неверная последовательность; 71: у нас поддерживается, почему нет;

    Некоторые ошибки (например эскейп-последовательности вне\внутри символьного класса, или неоткрытые\незакрытые имена после \g и \k делал как одну ошибку, поэтому констант у нас меньше чем 74 :) )

    ```

    Reported by `vostreltsov` on 2012-07-31 14:13:34

  5. Oleg Sychev reporter

    ``` Я думаю 12, 24, 28, 34,

    61 может сделать разумный предел для квантификаторов? А то автоматы еще выгребутся на ограничениях, а вот бэктрекингу туго придется...

    Может быть также 35, 38

    40 - когда будем делать рекурсию. Кстати надо о ней подумать - возможно это не так уж и сложно. При генерации ее всегда надо пропускать, если совпадение окончилось не внутри нее - тогда просто догенерировать что есть. А при совпадении - запускать очередную копию автомата - стек автоматов ;). ```

    Reported by `oasychev` on 2012-07-31 16:33:11

  6. Valeriy Streltsov

    ``` 12 сделано как нераспознанный\неподдерживаемый модификатор 28 сделал 34 сделал 35 сделал 38 сделал 73 сделал ```

    Reported by `vostreltsov` on 2012-08-03 20:22:34

  7. Oleg Sychev reporter

    ``` А с 24 проблема реальна есть? По идее оно означает, что после (?< должен идти = или ! - начало впередсмотрящего ассерта, остальное же будет считаться ошибкой.

    Считаете что нам в этом смысле выгодней разойтись с PCRE или трудно сделать? ```

    Reported by `oasychev` on 2012-08-06 14:21:14

  8. Oleg Sychev reporter

    ``` Я пока не буду закрывать, т.к. если мы решим сделать рекурсию - а ее польза очевидна - то нам придется реализовать ошибку 40. Или предпочитаете отдельную задачу? ```

    Reported by `oasychev` on 2012-08-06 22:06:48

  9. Valeriy Streltsov

    ``` Да пусть эта висит... ```

    Reported by `vostreltsov` on 2012-08-07 06:50:03

  10. Oleg Sychev reporter

    ``` Из коммита: "Убрал ошибку неверной escape-последовательности из YYINITIAL, поскольку похоже что PCRE игнорирует \ в любом случае и кидает ошибку только внутри СК. Нужно решить, сделать ли ошибку внутри СК или игнорировать \ в обоих местах." Записываю это здесь чтобы не забыть разобраться... ```

    Reported by `oasychev` on 2012-08-07 11:39:26

  11. Oleg Sychev reporter
    Валерий, у нас 40 теперь реализована?
    

    Reported by oasychev on 2014-12-03 00:32:30

  12. Valeriy Streltsov
    нет, нам надо настройку сделать макс. уровня рекурсии
    

    Reported by vostreltsov on 2014-12-03 08:38:31

  13. Oleg Sychev reporter
    40 это не глубина рекурсии, а регекс в котором бесконечный рекурсивный цикл, т.к. нет
    ветки в обход рекурсии. это статическая ошибка, которая сообщается в рамках известных
    нам механизмов
    
    глубину тоже надо, но это отдельный момент и может требовать доработки кросс-тестера,
    т.к. влияет на ответы в некоторых тестах...
    

    Reported by oasychev on 2014-12-03 10:37:46

  14. Log in to comment