Делает ли Perl 6 какие-либо обещания относительно порядка чередования порядка? - PullRequest
5 голосов
/ 20 апреля 2009

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

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

Ответы [ 2 ]

13 голосов
/ 20 апреля 2009

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

10 голосов
/ 20 апреля 2009

S05 говорит

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

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

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

...