Обратные ссылки в надежном синтаксисе: \g и другие варианты

Issue #88 closed
Oleg Sychev repo owner created an issue

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)

  1. Valeriy Streltsov

    ``` Реализовано, но есть небольшая проблема - JLex не понимает \w и \d. Пока что используется символьный класс [a-zA-Z_0-9]. ```

    Reported by `vostreltsov` on 2012-01-09 12:48:59

  2. Oleg Sychev reporter

    ``` Я немного не понял, на каком этапе вы собираетесь переводить относительные ссылки (отрицательные номера) в абсолютные? Чем раньше - тем лучше...

    Логичнее всего это делать прямо в сканере, если возможно. Найдете в документации по PCRE как интерпретируются ссылки с отрицательными номерами или вам процитировать?

    В юнит-тесты необходимо добавить проверку номера (имени) ссылки. Особенно для отрицательного числа... (поэтому перевожу в InProgress) ```

    Reported by `oasychev` on 2012-01-09 18:47:35 - Status changed: `InProgress`

  3. Valeriy Streltsov

    ``` Относительные собираюсь переводить в абсолютные в лексере, для этого достаточно помнить текущую незакрытую подмаску. Но это после того, как разберусь с duplicate subpattern numbers, нужно придумать как их нумеровать в лексере сразу, без рекурсивных обходов. Мне кажется, это можно сделать. ```

    Reported by `vostreltsov` on 2012-01-09 23:09:12

  4. Oleg Sychev reporter

    ``` Тогда этому рано в Fixed

    Боюсь что нумеровать без рекурсивных обходов не получится - там участвует структура, вложенность операций - ее вы лексером не поймаете... ```

    Reported by `oasychev` on 2012-01-10 07:07:12

  5. Oleg Sychev 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

  6. Oleg Sychev reporter

    ``` Для реализации обратных ссылок и их взаимодействия с матчером мне кажется лучшим решением будет создать абстрактный класс типа qtype_preg_matching_state - описывающий состояние матчинга. В нем - публичные функции, которые нужны узлам. Каждый матчер, поддерживающий их, будет наследовать и реализовывать их по своему. Объект этого класса может передаваться дополнительным параметром в match/next_character - со значением по умолчанию null.

    Это лучше чем использовать qtype_preg_matching_results, которые сделаны под другое, или функций матчера (которые устарели и будут удаляться). ```

    Reported by `oasychev` on 2012-01-25 07:55:30

  7. Oleg Sychev reporter

    ``` Спасибо ```

    Reported by `oasychev` on 2012-07-23 09:09:18 - Status changed: `Done`

  8. Log in to comment