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

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

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

5
задан Elizabeth Mattijsen 27 November 2019 в 19:19
поделиться

2 ответа

S05 говорит

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

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

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

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

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

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

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

10
ответ дан 18 December 2019 в 06:51
поделиться

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

13
ответ дан 18 December 2019 в 06:51
поделиться