Обратные ссылки в надежном синтаксисе: \g и другие варианты
Originally reported on Google Code with ID 88 ``` The sequence \g followed by an unsigned or a negative number, optionally enclosed in braces, is an absolute or relative back reference. A named back reference can be coded as \g{name}.
\n reference by number (can be ambiguous) \gn reference by number \g{n} reference by number \g{-n} relative reference by number \k<name> reference by name (Perl) \k'name' reference by name (Perl) \g{name} reference by name (Perl) \k{name} reference by name (.NET) (?P=name) reference by name (Python) ```
Reported by `oasychev` on 2012-01-02 22:19:21
Comments (8)
-
-
reporter ``` Я немного не понял, на каком этапе вы собираетесь переводить относительные ссылки (отрицательные номера) в абсолютные? Чем раньше - тем лучше...
Логичнее всего это делать прямо в сканере, если возможно. Найдете в документации по PCRE как интерпретируются ссылки с отрицательными номерами или вам процитировать?
В юнит-тесты необходимо добавить проверку номера (имени) ссылки. Особенно для отрицательного числа... (поэтому перевожу в InProgress) ```
Reported by `oasychev` on 2012-01-09 18:47:35 - Status changed: `InProgress`
-
``` Относительные собираюсь переводить в абсолютные в лексере, для этого достаточно помнить текущую незакрытую подмаску. Но это после того, как разберусь с duplicate subpattern numbers, нужно придумать как их нумеровать в лексере сразу, без рекурсивных обходов. Мне кажется, это можно сделать. ```
Reported by `vostreltsov` on 2012-01-09 23:09:12
-
reporter ``` Тогда этому рано в Fixed
Боюсь что нумеровать без рекурсивных обходов не получится - там участвует структура, вложенность операций - ее вы лексером не поймаете... ```
Reported by `oasychev` on 2012-01-10 07:07:12
-
reporter ``` В связи с появлением именованных подмасок прежняя схема работы с подмасками сугубо по номерам требует апгрейда.
Я добавил в хэндлер поле subpatternkeys - комментарий вроде бы достаточно понятный написал к нему. Необходимо: 1)заполнить поле subpatternkeys в классе хэндлера при лексическом/синтаксическом разборе (лексемы пока не трогаем), 2) использовать его в invalidate_match и проверках в is_subpattern_captured, first_correct_character_index, match_length, last_correct_character_index, matched_part и т.д.
```
Reported by `oasychev` on 2012-01-14 04:59:09
-
Reported by `vostreltsov` on 2012-01-21 09:05:01 - Status changed: `Fixed`
-
reporter ``` Для реализации обратных ссылок и их взаимодействия с матчером мне кажется лучшим решением будет создать абстрактный класс типа qtype_preg_matching_state - описывающий состояние матчинга. В нем - публичные функции, которые нужны узлам. Каждый матчер, поддерживающий их, будет наследовать и реализовывать их по своему. Объект этого класса может передаваться дополнительным параметром в match/next_character - со значением по умолчанию null.
Это лучше чем использовать qtype_preg_matching_results, которые сделаны под другое, или функций матчера (которые устарели и будут удаляться). ```
Reported by `oasychev` on 2012-01-25 07:55:30
-
reporter ``` Спасибо ```
Reported by `oasychev` on 2012-07-23 09:09:18 - Status changed: `Done`
- Log in to comment
``` Реализовано, но есть небольшая проблема - JLex не понимает \w и \d. Пока что используется символьный класс [a-zA-Z_0-9]. ```
Reported by `vostreltsov` on 2012-01-09 12:48:59