Полная совместимость лексера с PCRE
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)
-
reporter -
Account Deleted ``` Флажок уже предусматривает свойства юникода. Поиск совпадения силами прегматч (надо переделать на кутайп_прег_уникод), таким образом флажок менять почти не требуется, да и то не срочно (можно временно поработать на прегматче), самому чарсету вообще безразличен тип флажка, его тем более трогать незачем. Другое дело, что нужно запилить нормальную генерацию символа, вместо иамеющийся затычки, но это уже другая задача. Таким образом, сначала нужно запилить их в лексере, а уже потом с флажками и нашей строкой работать. ИМХО. ```
Reported by `Xapuyc7` on 2012-06-28 09:56:45
-
repo owner ``` Записываю чтобы помнилось: для полноценного использования - например с кросс-тестами - лексер должен не пропускать, а именно распознавать и создавать узлы всех хитрых особенностей PCRE, чтобы они затем отбрасывались на accept'е матчерами. Иначе возможен запуск кросс-тестов, которые матчер не понимает, с неправильными результатами. ```
Reported by `oasychev` on 2012-07-12 11:32:32
-
reporter ``` Это пофиксил. Я все-таки предлагаю сделать лексер полностью совместимым с PCRE, включая квантификаторы в начале строки - иначе тесты могут фейлиться. Можно, например, заполнять warning'и в лексере и как-то показывать юзеру что он ввел что-то неочевидное. Еще такая проблема, если ввести например a{3, 7} то PCRE это расценит как строку "a{3, 7}" потому что там есть пробел. У нас же опять будет unmatched input exception. Я предлагаю для надежности в конце лексера ввести правило . чтобы всё что не сматчилось выше, расценивалось как обычный символ. Иначе таких ситуаций может быть очень и очень много... ```
Reported by `vostreltsov` on 2012-07-20 08:06:40
-
repo owner ``` Ну лексер то определяет квантификаторы в начале строки, это парсер уже генерирует ошибки... А что у вас делает кросс-тестер если ошибка в регексе? Фейлит или выводит сообщение и пропускает?
Насчет добавления точки в конце в принципе согласен, но скорее в виде [^
] - и подумать, возможно есть другие неподходящие для этого дела символы... ```Reported by `oasychev` on 2012-07-20 11:14:48
-
repo owner ``` Не забывайте устаналивать компонент... ```
Reported by `oasychev` on 2012-07-20 12:13:50 - Labels added: Component-Preg
-
reporter ``` Кросс-тестер показывает ошибку и пропускает к следующему тесту сейчас. Смысл как раз в лексере, а не в парсере - можно проверить, было ли что-то захвачено до квантификатора как операнд (в начале регекса или после открывающей скобки - банальный флажок true-false), и если не было - возвратить массив токенов-чарсетов вместо узла-квантификатора, как в PCRE. В принципе, можно даже завести в лексере поле, устанавливающее его поведение в этой ситуации и делать проверку внутри правил квантификаторов. 2 лексера, как сейчас написано на мудл-доках, не потребуется. ```
Reported by `vostreltsov` on 2012-07-20 13:46:35
-
repo owner ``` Нужно сделать нотацию PCRE Strict - см
#49```Reported by `oasychev` on 2012-07-20 17:29:33
-
repo owner ``` Желательно проверить парсинг testinput1 на наличие ошибок. Если есть - обсудить здесь их... Если нет - можно закрывать... ```
Reported by `oasychev` on 2012-07-20 17:32:27
-
reporter ``` Остались только ошибки неправильных скобок\квантификатора без операндов. ```
Reported by `vostreltsov` on 2012-07-20 19:12:43 - Status changed: `Fixed`
-
repo owner ``` Ну это уже скорее проблема не сканера, а парсера... ```
Reported by `oasychev` on 2012-07-23 07:21:06 - Status changed: `Done`
-
repo owner ``` Для условных подмасок реализованы только варианты с ассертами, надо все. ```
Reported by `oasychev` on 2012-07-23 09:05:23 - Status changed: `InProgress`
-
reporter Reported by `vostreltsov` on 2012-07-24 18:10:37 - Status changed: `Fixed`
-
repo owner ``` Я думаю, до введения режима полной совместимости через опции хэндлинга, говорить об исправлении этого рано. Теперь - после исправления 72 - необходимость в этом возросла... ```
Reported by `oasychev` on 2012-07-30 07:02:54 - Status changed: `InProgress`
-
repo owner ``` И раз уж мы сделали рефакторинг функций, создающих узлы - не лучше ли поместить этот код (или большую его часть) в конструкторы самих узлов? ```
Reported by `oasychev` on 2012-07-30 08:09:15
-
reporter ``` То что можно перенести, я перенес. Например, границы у квантификатора, или подтипы для разных узлов - теперь параметры конструкторов узлов. На счет определения ошибок сложнее. В узлах в принципе можно определить всего 2 логические ошибки - неверные границы квантификатора или чарсета. Т.е. 90% ошибок генерируются все равно в лексере и возвращаются в виде листьев-ошибок, а не узлов со вложенными ошибками. Вдобавок к этому, ошибкам нужно знать индексы в строке, а их знает только лексер (для узлов они устанавливаются после конструктора, иначе список его аргументов будет километровый, поэтому можно сказать что узлы не знают индексов). ```
Reported by `vostreltsov` on 2012-08-02 09:16:29
-
repo owner Вроде теперь исправлено.
Reported by
oasychev
on 2013-01-06 19:49:42 - Status changed:Done
- Log in to comment
``` Реализовано: \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