Параметры матчинга
Originally reported on Google Code with ID 125
В классы хендлера и матчера добавлен параметр - опции.
Создан класс опций матчинга, включающий:
1) необходимость генерации продолжения - пока устанавливается по наличию хинта в вопросе;
2) необходимость захвата подмасок;
3) предпочитаемые алфавиты для букв и точки - пока не используются - какие символы
генерировать при продолжении
Валерий, вам необходимо в первую очередь обеспечить выставку опции подмасок в 1 если
есть обратные ссылки - сейчас она устанавливается по нуждам вопроса, а есть еще нужды
выражения. Поэтому назначаю пока на вас.
После этого можно сделать простую оптимизацию, отключив подмаски/генерацию продолжения
если они не нужны.
Предложения по пополнению состава параметров матчинга также следует публиковать здесь.
Reported by oasychev
on 2012-06-02 07:59:46
Comments (12)
-
-
reporter ``` Поле наличия ссылок завести в лексере, а из конструктора матчера проверить его и выставить опцию (она protected в матчере). Только после вызова родительского конструктора конечно... ```
Reported by `oasychev` on 2012-06-02 14:34:14
-
``` Мне кажется, нужно определить еще конструктор по умолчанию для этих $options, в котором будет включен и захват подмасок, и генерация подсказки. Во-первых, юнит-тесты их проверяют в любом случае, а во-вторых - во внутренних функциях удобно брать параметры из гарантированно существующего $options, чем проверять его на null и затем брать из него поля. ```
Reported by `vostreltsov` on 2012-06-02 17:19:24
-
reporter ``` Конструктор по умолчанию не спасет, это вас не Си++. Поля не имеют типов. Для гарантированно существующего $options нужно вставить код в конструктор абстрактного матчера, который сгенерирует объект опций если будет null. С другой стороны конструктор по умолчанию не нужен в данном случае т.к. поля в PHP могут иметь значения по умолчанию. И они там есть и именно такие значения и имеют, если вы мой код видели :)
А в кросс-тестах по идее этот объект можно в одно место в цикле вписать. Но наличие гарантированного объекта в $options полезно, добавьте в конструктор его создание. ```
Reported by `oasychev` on 2012-06-02 18:03:17
-
``` Получить обратные ссылки из матчера не удастся - лексер создается в функции build_tree хэндлера... Нужно либо добавить поле в хэндлер, либо заполнять поле с обратными ссылками в хэндлере. Второй вариант какой-то нелогичный: хэндлер (родитель) использует этот класс опций, который описан в файле с наследником - матчером... Не логичнее ли вообще весь этот код с опциями деражать в матчере? ```
Reported by `vostreltsov` on 2012-06-03 05:10:23
-
reporter ``` Предлагаю добавить в хэндлер ссылки на объекты лексера и парсера как свойства, тогда всем можно будет обращаться... Иначе замучаемся переписывать их результаты каждое поле в отдельности. Можно тогда и другие параметры оставить в лексере/парсере, которые сейчас перенесены в сам хендлер/матчер.
Идея с опциями была та, что возможно другим хэдлерам понадобятся другие опции, чем матчерам. И не вижу смысла от нее отказываться...
Код работы с опциями матчера должен быть конечно в матчере. ```
Reported by `oasychev` on 2012-06-05 08:06:47
-
reporter ``` Код с опциями вытолкнут. Теперь надо позаботится чтобы при наличии обратных ссылок опция подмасок обязательно устанавливалась после синтаксического разбора - и можно поправлять матчер на их использование. ```
Reported by `oasychev` on 2012-07-20 12:00:37 - Labels added: Component-Preg
-
``` Заполнение подмасок сделал. Пришлось добавить сеттер для опций, поскольку кросс-тестер теперь использует get_matcher, опции определяются внутри него, а forced-захват подмасок все равно нужен при тестировании.
На счет алфавита - не знаю как его определять, хоть делать еще одну настройку в вопросе... Если анализировать регекс на то, какие в нем алфавиты - будут дичайшие тормоза. ```
Reported by `vostreltsov` on 2012-07-28 09:57:25
-
reporter ``` Хм. Насчет опций подумаю - как-то аргументов много, добавлять под них еще один неохота...
Насчет алфавита - да, заполняться будет скорее всего через настройки вопроса. Но не сию секунду, это я на будущее как возможное применение обозначил.
Прямо сейчас я думаю создать опции хэндлинга, ввести туда параметр совместимости с PCRE, и унаследовать от них опции матчинга... ```
Reported by `oasychev` on 2012-07-30 07:49:28
-
reporter ``` НКА матчер уже уважает опции, в т.ч. про отсутствие необходимости генерировать продолжение. Чего и ДКА желаю. Но прежде всего надо в конструкторе их поймать и передать в конструктор родителя... ```
Reported by `oasychev` on 2012-08-06 22:08:58
-
reporter Вроде сделано?
Reported by
oasychev
on 2013-05-26 19:20:25 - Status changed:Fixed
-
Reported by
vostreltsov
on 2013-05-26 20:28:27 - Status changed:Done
- Log in to comment
``` Мне кажется удобнее всего это сделать прямо в лексере, по аналогии с подмасками - завести поле, что есть обратные ссылки. ```
Reported by `vostreltsov` on 2012-06-02 13:05:27