Полная совместимость лексера с PCRE

Issue #126 closed
Valeriy Streltsov created an issue

Originally reported on Google Code with ID 126

Нужно сделать лексер полностью совместимым с PCRE.

Сейчас уже полностью поддерживаются разные ситуации с интерпретацией \ddd (обратная
ссылка или символ), есть правила для всех escape-последовательностей, но внутри \p,
\P, \A, \z, \Z и \G стоят заглушки.

Reported by vostreltsov on 2012-06-25 15:01:29

Comments (17)

  1. Valeriy Streltsov reporter

    ``` Реализовано: \a, \cx, \e, \f, \n, \r, \t, \d, \h, \s, \v, \w, \c, \u, \b, \z, их негативные аналоги, а также \G как эквивалент ^ (ответ-то у нас однострочный?).

    Остались экзотические вещи: \K, \R, \X - в них стоят выбросы исключений. Реально полезные вещи, оставшиеся для реализации - это \p и \P. Для них нужно добавлять новые константы в узлы, писать функции в qtype_preg_unicode и т.д... ```

    Reported by `vostreltsov` on 2012-06-28 08:00:48

  2. Former user Account Deleted

    ``` Флажок уже предусматривает свойства юникода. Поиск совпадения силами прегматч (надо переделать на кутайп_прег_уникод), таким образом флажок менять почти не требуется, да и то не срочно (можно временно поработать на прегматче), самому чарсету вообще безразличен тип флажка, его тем более трогать незачем. Другое дело, что нужно запилить нормальную генерацию символа, вместо иамеющийся затычки, но это уже другая задача. Таким образом, сначала нужно запилить их в лексере, а уже потом с флажками и нашей строкой работать. ИМХО. ```

    Reported by `Xapuyc7` on 2012-06-28 09:56:45

  3. Oleg Sychev repo owner

    ``` Записываю чтобы помнилось: для полноценного использования - например с кросс-тестами - лексер должен не пропускать, а именно распознавать и создавать узлы всех хитрых особенностей PCRE, чтобы они затем отбрасывались на accept'е матчерами. Иначе возможен запуск кросс-тестов, которые матчер не понимает, с неправильными результатами. ```

    Reported by `oasychev` on 2012-07-12 11:32:32

  4. Valeriy Streltsov reporter

    ``` Это пофиксил. Я все-таки предлагаю сделать лексер полностью совместимым с PCRE, включая квантификаторы в начале строки - иначе тесты могут фейлиться. Можно, например, заполнять warning'и в лексере и как-то показывать юзеру что он ввел что-то неочевидное. Еще такая проблема, если ввести например a{3, 7} то PCRE это расценит как строку "a{3, 7}" потому что там есть пробел. У нас же опять будет unmatched input exception. Я предлагаю для надежности в конце лексера ввести правило . чтобы всё что не сматчилось выше, расценивалось как обычный символ. Иначе таких ситуаций может быть очень и очень много... ```

    Reported by `vostreltsov` on 2012-07-20 08:06:40

  5. Oleg Sychev repo owner

    ``` Ну лексер то определяет квантификаторы в начале строки, это парсер уже генерирует ошибки... А что у вас делает кросс-тестер если ошибка в регексе? Фейлит или выводит сообщение и пропускает?

    Насчет добавления точки в конце в принципе согласен, но скорее в виде [^
    ] - и подумать, возможно есть другие неподходящие для этого дела символы... ```

    Reported by `oasychev` on 2012-07-20 11:14:48

  6. Oleg Sychev repo owner

    ``` Не забывайте устаналивать компонент... ```

    Reported by `oasychev` on 2012-07-20 12:13:50 - Labels added: Component-Preg

  7. Valeriy Streltsov reporter

    ``` Кросс-тестер показывает ошибку и пропускает к следующему тесту сейчас. Смысл как раз в лексере, а не в парсере - можно проверить, было ли что-то захвачено до квантификатора как операнд (в начале регекса или после открывающей скобки - банальный флажок true-false), и если не было - возвратить массив токенов-чарсетов вместо узла-квантификатора, как в PCRE. В принципе, можно даже завести в лексере поле, устанавливающее его поведение в этой ситуации и делать проверку внутри правил квантификаторов. 2 лексера, как сейчас написано на мудл-доках, не потребуется. ```

    Reported by `vostreltsov` on 2012-07-20 13:46:35

  8. Oleg Sychev repo owner

    ``` Нужно сделать нотацию PCRE Strict - см #49 ```

    Reported by `oasychev` on 2012-07-20 17:29:33

  9. Oleg Sychev repo owner

    ``` Желательно проверить парсинг testinput1 на наличие ошибок. Если есть - обсудить здесь их... Если нет - можно закрывать... ```

    Reported by `oasychev` on 2012-07-20 17:32:27

  10. Valeriy Streltsov reporter

    ``` Остались только ошибки неправильных скобок\квантификатора без операндов. ```

    Reported by `vostreltsov` on 2012-07-20 19:12:43 - Status changed: `Fixed`

  11. Oleg Sychev repo owner

    ``` Ну это уже скорее проблема не сканера, а парсера... ```

    Reported by `oasychev` on 2012-07-23 07:21:06 - Status changed: `Done`

  12. Oleg Sychev repo owner

    ``` Для условных подмасок реализованы только варианты с ассертами, надо все. ```

    Reported by `oasychev` on 2012-07-23 09:05:23 - Status changed: `InProgress`

  13. Oleg Sychev repo owner

    ``` Я думаю, до введения режима полной совместимости через опции хэндлинга, говорить об исправлении этого рано. Теперь - после исправления 72 - необходимость в этом возросла... ```

    Reported by `oasychev` on 2012-07-30 07:02:54 - Status changed: `InProgress`

  14. Oleg Sychev repo owner

    ``` И раз уж мы сделали рефакторинг функций, создающих узлы - не лучше ли поместить этот код (или большую его часть) в конструкторы самих узлов? ```

    Reported by `oasychev` on 2012-07-30 08:09:15

  15. Valeriy Streltsov reporter

    ``` То что можно перенести, я перенес. Например, границы у квантификатора, или подтипы для разных узлов - теперь параметры конструкторов узлов. На счет определения ошибок сложнее. В узлах в принципе можно определить всего 2 логические ошибки - неверные границы квантификатора или чарсета. Т.е. 90% ошибок генерируются все равно в лексере и возвращаются в виде листьев-ошибок, а не узлов со вложенными ошибками. Вдобавок к этому, ошибкам нужно знать индексы в строке, а их знает только лексер (для узлов они устанавливаются после конструктора, иначе список его аргументов будет километровый, поэтому можно сказать что узлы не знают индексов). ```

    Reported by `vostreltsov` on 2012-08-02 09:16:29

  16. Oleg Sychev repo owner
    Вроде теперь исправлено.
    

    Reported by oasychev on 2013-01-06 19:49:42 - Status changed: Done

  17. Log in to comment