2009-04-20 7 views
5

Angesichts einer Alternation wie /(foo|foobar|foobaz)/ macht Perl 6 irgendwelche Versprechungen, welche der drei zuerst verwendet werden, und wenn es tut, wo in der Dokumentation macht es dieses Versprechen?Verspricht Perl 6 irgendwelche Versprechungen bezüglich der Reihenfolge, in der die Änderungen verwendet werden?

Siehe die verwandte Frage Does Perl currently (5.8 and 5.10) make any promises about the order alternations will be used?.

+3

Es fällt mir auf, dass Perl 6 viele Versprechungen macht. Bis Larry uns ein aktuelles Veröffentlichungsdatum gibt, werde ich keinem von ihnen glauben :-) – bedwyr

+0

Heh, naja, Regeln scheinen meistens erledigt zu sein und ich erwarte zu diesem Zeitpunkt keine Änderungen an ihnen. Wenn sich das ändert, kann sich die Antwort hier auch ändern. –

Antwort

10

S05 sagt

Zu diesem Zweck wird jede Regex in Perl 6 benötigt, um seine „reine“ Muster von seinen Aktionen zu unterscheiden, und das Rück seine Liste der anfänglichen Token-Muster (transitively einschließlich des Tokens Muster jeder Unterregel, die mit dem "reinen" Teil dieser Regex bezeichnet wird, aber keine Unterregel mehr als einmal enthält, da dies eine Selbstreferenz beinhalten würde, die in traditionellen regulären Ausdrücken nicht erlaubt ist. Eine logische Abwechslung mit | nimmt dann zwei oder mehr dieser Listen und Versendungen zu der Alternative, die dem längsten Token-Präfix entspricht. Dies kann oder kann nicht die Alternative sein, die zuerst lexikalisch kommt.

Wenn jedoch zwei Alternativen mit der gleichen Länge übereinstimmen, wird der Zusammenhang zuerst durch Spezifität unterbrochen. Die Alternative, die mit der längsten festen Zeichenfolge beginnt, gewinnt. Das heißt, eine exakte Übereinstimmung zählt als näher als eine Übereinstimmung mit Zeichenklassen. Wenn das nicht funktioniert, ist die Krawatte nach einer von zwei Methoden gebrochen. Wenn sich die Alternativen in verschiedenen Grammatiken befinden, bestimmt die Standard-MRO (Methodenauflösungsreihenfolge), welche zuerst getestet werden soll. Wenn sich die Alternativen in derselben Grammatikdatei befinden, hat die textuell frühere Alternative Vorrang. (Wenn ein Regeln der Grammatik in mehr als eine Datei definiert ist, ist die Reihenfolge nicht definiert, und eine explizite Behauptung zu verwenden Scheitern zu erzwingen, wenn die falschen zuerst versucht wird.)

Dies scheint ein sehr unterschiedlich zu sein Versprechen aus dem in Perl 5 gemacht.

13

Um es nur ein paar Worte zu sagen: die Alternativen sollten parallel (mindestens fiktiv) übereinstimmen, und die längste Übereinstimmung gewinnt. Wenn Sie sequenzielle Änderungen wünschen, können Sie den doppelten Balken || verwenden, der wie von | eine Anordnung von links nach rechts verspricht macht in Perl 5 Regexes.