2009-04-20 8 views
5

Dada una alternancia como /(foo|foobar|foobaz)/, ¿hace Perl 6 alguna promesa sobre cuál de los tres se usará primero, y si lo hace en qué parte de la documentación hace esa promesa?¿Perl 6 hace alguna promesa sobre el orden en que se usarán las alternancias?

Ver la pregunta relacionada Does Perl currently (5.8 and 5.10) make any promises about the order alternations will be used?.

+3

Me parece que Perl 6 hace muchas promesas. Hasta que Larry nos dé una fecha de lanzamiento real, no voy a creer en ninguno de ellos :-) – bedwyr

+0

Heh, bueno, las reglas parecen estar hechas en su mayoría y no espero ningún cambio en ellas en este momento. Dicho esto, si cambia, la respuesta aquí también puede cambiar. –

Respuesta

10

S05 dice

A tal fin, cada expresión regular en Perl 6 se requiere que sea capaz de distinguir sus patrones "puros" de sus acciones, y volver a su lista de patrones de fichas iniciales (transitivamente incluyendo el token patrones de cualquier subregla llamada por la parte "pura" de esa expresión regular, pero sin incluir ninguna subregla más de una vez, ya que implicaría la auto-referencia, lo cual no está permitido en las expresiones regulares tradicionales). Una alternancia lógica utilizando | luego toma dos o más de estas listas y envíos a la alternativa que coincida con el prefijo de token más largo. Esta puede o no ser la alternativa que viene primero léxicamente.

Sin embargo, si dos alternativas coinciden en la misma longitud, el vínculo se rompe primero por especificidad. La alternativa que comienza con la cadena fija más larga gana; es decir, una coincidencia exacta cuenta como más cercana que una coincidencia hecha usando clases de caracteres. Si eso no funciona, el empate se rompe por uno de dos métodos. Si las alternativas están en diferentes gramáticas, el MRO estándar (orden de resolución del método) determina cuál probar primero. Si las alternativas están en el mismo archivo de gramática, la alternativa textualmente anterior tiene prioridad. (Si las reglas de una gramática se definen en más de un archivo, el orden es indefinido, y una afirmación explícita debe ser usado para forzar fracaso si el mal se trató en primer lugar.)

Esto parece ser una muy diferente promesa de la hecha en Perl 5.

13

Para ponerlo solo unas pocas palabras: las alternativas deben coincidir (al menos teóricamente) en paralelo, y la partida más larga gana. Si desea alternar secuenciales, puede usar la barra doble ||, que promete un orden de izquierda a derecha igual que | lo hace en Perl 5 expresiones regulares.

Cuestiones relacionadas