Дает ли Perl 6 какие-либо обещания относительно порядка чередования, который будет использоваться?

StackOverflow https://stackoverflow.com/questions/766480

  •  12-09-2019
  •  | 
  •  

Вопрос

Учитывая чередование , подобное /(foo|foobar|foobaz)/ дает ли Perl 6 какие-либо обещания относительно того, какой из трех будет использоваться первым, и если дает, то где в документации он дает это обещание?

Смотрите соответствующий вопрос Дает ли Perl в настоящее время (5.8 и 5.10) какие-либо обещания относительно порядка чередования, который будет использоваться?.

Это было полезно?

Решение 2

S05 говорит

С этой целью каждое регулярное выражение в Perl 6 должно быть способно отличать свои "чистые" шаблоны от своих действий и возвращать свой список исходных шаблонов токенов (транзитивно включая шаблоны токенов любого подчиненного правила, вызываемого "чистой" частью этого регулярного выражения, но не включая ни одно подчиненное правило более одного раза, поскольку это включало бы ссылку на себя, что не допускается в традиционных регулярных выражениях).Логическое чередование с использованием | затем принимает два или более из этих списков и отправляет альтернативе, которая соответствует самому длинному префиксу токена.Это может быть, а может и не быть альтернативой, которая стоит на первом месте в лексическом плане.

Однако, если две альтернативы совпадают по одинаковой длине, связь сначала нарушается из-за специфичности.Выигрывает альтернатива, начинающаяся с самой длинной фиксированной строки;то есть точное совпадение считается более близким, чем совпадение, выполненное с использованием классов символов.Если это не сработает, связь разорвется одним из двух способов.Если альтернативы представлены в разных грамматиках, стандартный MRO (порядок разрешения метода) определяет, какую из них попробовать в первую очередь.Если альтернативы находятся в одном и том же файле грамматики, приоритет имеет более ранняя по тексту альтернатива.(Если правила грамматики определены более чем в одном файле, порядок не определен, и необходимо использовать явное утверждение, чтобы вызвать сбой, если сначала будет попробовано неправильное.)

Похоже, это обещание сильно отличается от того, что было сделано в Perl 5.

Другие советы

Чтобы выразить это всего в нескольких словах:альтернативы должны быть подобраны (по крайней мере, условно) параллельно, и выигрывает самое длинное совпадение.Если вам нужны последовательные чередования, вы можете использовать двойную строку ||, которая обещает порядок слева направо точно так же, как | делает в регулярных выражениях Perl 5.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top