parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Воткнулся в интересный "хак" изучая методы rsplit от Misha.v.3 и E.Spearance, поясните почему так?

@chusov 15.08.2021 23:41 / 15.08.2021 23:49

Если что нуб в Парсере, поэтому прошу носом в книгу.

TL;DR
Изучая регулярку в реализации пользовательского оператора rsplit, надо отдать должное, что у Misha v.3 она выглядит недвусмысленно, а вот у E.Spearance в глаза бросился "хак" (отражение которого я не вижу в документации).

Ссылки на реализации rsplit:
изначальная от E.Spearance
и
оптимизированная от Misha v.3
Не усложняя, возьмем строку, например
$str[Masha-da-ne-nasha]
и простой разделитель
$delimeter[-]


в реализации Misha.v.3 регулярка имеет вид:
^str.match[(.+?)(?:$sRegex|^$)][g]

что дает ясное понимание:
  нежадной квантификацией для первой группы скобок
  найти все подстроки перед разделителем
  (описаным во второй группе скобок)
  или 
  перед концом всей строки, что логично, т.к.
  в описание (подстрока)(разделитель)
  попадут только:
  (Masha)(-)
  (da)(-)
  (ne)(-)
  а "nasha"
  попадет под
  (nasha)(^$)

  
Но у E.Spearance мне бросился в глаза "хак" без "или", вида:

$table_split[^table::create{piece}]
$result[^text.match[(.*?)(?:$regex)][g]{^if(def $match.1{^table_split.append{$match.1}}}]
^if(def $result){^table_split.append{$result}}

Т.е. он так же ищет все паттерны
(подстрока)(разделитель)
в которую войдут только первые три слова "Masha, da, ne"

А остаток после разделителя и до конца строки он получает из
result'a
И именно в этом суть вопроса: а как это так?
Почему во-первых, в результате match - строка?!
Когда в документации написано:
Если указана опция поиска g, будет создана таблица (объект класса table) найденного по шаблону (по одной строке на каждое вхождение). Если опция g не была указана, то таблица будет содержать лишь одну строку с первым вхождением. Если не было найдено ни одного совпадения, то результатом операции будет пустая таблица. Если указана опция n то вместо таблицы с результатами будет возвращаться число - количество найденных совпадений.
Только тип table или тип int/double (при опции n) - точка!
Где я пропускаю текст и не вижу в документации, чтобы метод match возвращал тип string?


И раз уж он это делает, то где описано, почему туда попадает
подстрока-"остаток" от "непопавшей под остальной шаблон" строки?

Спасибо.