Raku reglas son la expresión regular , la coincidencia de cadenas y de uso general de análisis de las instalaciones de la Raku lenguaje de programación, y son una parte esencial de la lengua. Dado que las construcciones de coincidencia de patrones de Perl han excedido las capacidades de las expresiones regulares formales durante algún tiempo, la documentación de Raku se refiere a ellas exclusivamente como expresiones regulares , distanciando el término de la definición formal.
Raku proporciona un superconjunto de características de Perl 5 con respecto a las expresiones regulares, plegándolas en un marco más grande llamado reglas , que proporcionan las capacidades de una gramática de expresión sintáctica , además de actuar como un cierre con respecto a su alcance léxico. [1] Las reglas se introducen con la rule
palabra clave, que tiene un uso bastante similar al de las definiciones de subrutinas. Las reglas anónimas se pueden introducir con la palabra clave regex
(o rx
), o simplemente se pueden usar en línea como las expresiones regulares estaban en Perl 5 a través de los operadores m
(coincidencia) o s
(sustitución).
Historia
En Apocalipsis 5 , un documento que describe las decisiones de diseño preliminares para la coincidencia de patrones Raku, Larry Wall enumeró 20 problemas con la "cultura actual de expresiones regulares". Entre ellos se encontraban que las expresiones regulares de Perl eran "demasiado compactas y 'lindas'", tenían "demasiada confianza en muy pocos metacaracteres", "poco soporte para capturas con nombre", "poco soporte para gramáticas" y "pobre integración con 'real' idioma". [2]
Entre finales de 2004 y mediados de 2005, se desarrolló un compilador de reglas de estilo Raku para la máquina virtual Parrot llamado Parrot Grammar Engine (PGE), que luego pasó a llamarse Parser Grammar Engine más genérico . PGE es una combinación de tiempo de ejecución y compilador para gramáticas de estilo Raku que permite a cualquier compilador basado en loros utilizar estas herramientas para analizar y también proporcionar reglas a sus tiempos de ejecución.
Entre otras características de Raku, el soporte para capturas con nombre se agregó a Perl 5.10 en 2007. [3]
En mayo de 2012, la implementación de referencia de Raku, Rakudo , envió su instantánea mensual Rakudo Star con un analizador JSON funcional construido completamente con reglas Raku. [4]
Cambios de Perl 5
Solo hay seis características sin cambios de las expresiones regulares de Perl 5:
- Literales: caracteres de palabras (letras, números y guiones bajos ) que coinciden literalmente
- Capturando:
(...)
- Alternativas:
|
- Escape de barra invertida:
\
- Cuantificadores de repetición:
*
,+
y?
, aunque no{m,n}
- Minimal coincidente sufijo:
*?
,+?
,??
Algunas de las adiciones más poderosas incluyen:
- La capacidad de hacer referencia a reglas usando
para construir gramáticas completas. - Un puñado de operadores de confirmación que permiten al programador controlar el retroceso durante la comparación.
Los siguientes cambios mejoran en gran medida la legibilidad de las expresiones regulares:
- Grupos simplificados que no capturan:,
[...]
que son los mismos que los de Perl 5:(?:...)
- Afirmaciones de código simplificadas:
{...}>
- Permite incluir espacios en blanco sin coincidir, lo que permite expresiones regulares de varias líneas. Utilice
\
o' '
para expresar espacios en blanco. - El formato de expresión regular extendido (Perl 5
/x
) es ahora el predeterminado.
Cambios implícitos
Algunas de las características de las expresiones regulares de Perl 5 son más poderosas en Raku debido a su capacidad para encapsular las características ampliadas de las reglas de Raku. Por ejemplo, en Perl 5, había operadores de búsqueda anticipada positivos y negativos (?=...)
y (?!...)
. En Raku existen estas mismas características, pero se llaman
y .
Sin embargo, debido a que before
puede encapsular reglas arbitrarias, se puede usar para expresar la búsqueda anticipada como un predicado sintáctico para una gramática. Por ejemplo, la siguiente gramática de expresión de análisis describe el lenguaje clásico sin contexto:
S ← & ( A ! B ) a + B A ← a A ? b B ← b B ? C
En las reglas de Raku, eso sería:
regla S { > a + } regla A { a ? b } regla B { b ? c }
Por supuesto, dada la capacidad de mezclar reglas y código regular, eso se puede simplificar aún más:
regla S { (a +) (b +) (c +) < { $ 0 . elems == $ 1 . elems == $ 2 . elems } > }
Sin embargo, esto hace uso de afirmaciones , que es un concepto sutilmente diferente en las reglas de Raku, pero más sustancialmente diferente en la teoría del análisis sintáctico, lo que lo convierte en un predicado semántico en lugar de sintáctico. La diferencia más importante en la práctica es el rendimiento. No hay forma de que el motor de reglas sepa qué condiciones puede coincidir con la aserción, por lo que no se puede realizar ninguna optimización de este proceso.
Integración con Perl
En muchos lenguajes, las expresiones regulares se ingresan como cadenas, que luego se pasan a las rutinas de la biblioteca que las analizan y compilan en un estado interno. En Perl 5, las expresiones regulares compartían parte del análisis léxico con el escáner de Perl. Esto simplificó muchos aspectos del uso de expresiones regulares, aunque agregó una gran complejidad al escáner. En Raku, las reglas son parte de la gramática del idioma. No existe un analizador independiente para las reglas, como sucedía en Perl 5. Esto significa que el código, incrustado en las reglas, se analiza al mismo tiempo que la propia regla y el código que la rodea. Por ejemplo, es posible anidar reglas y código sin volver a invocar el analizador:
regla ab { (a.) # coincide con "a" seguida de cualquier carácter # Luego, verifique si ese carácter era "b" # Si es así, imprima un mensaje. { $ 0 ~~ / b {di "encontré la b"} / }}
Lo anterior es un solo bloque de código Raku que contiene una definición de regla externa, un bloque interno de código de aserción y dentro de él una expresión regular que contiene un nivel más de aserción.
Implementación
Palabras clave
Hay varias palabras clave que se utilizan junto con las reglas de Raku:
- regex
- Una expresión regular con nombre o anónimo que ignora los espacios en blanco dentro de la expresión regular de forma predeterminada.
- simbólico
- Una expresión regular con nombre o anónimo que implica el
:ratchet
modificador. - regla
- Una expresión regular con nombre o anónimo que implica los modificadores
:ratchet
y:sigspace
. - rx
- Una expresión regular anónima que toma delimitadores arbitrarios, como
//
donde la expresión regular solo toma llaves. - metro
- Una forma de operador de expresión regular anónima que realiza coincidencias con delimitadores arbitrarios.
- mm
- Abreviatura de m con el
:sigspace
modificador. - s
- Una forma de operador de expresión regular anónima que realiza la sustitución con delimitadores arbitrarios.
- ss
- Abreviatura de s con el
:sigspace
modificador. /.../
- Simplemente colocar una expresión regular entre barras es una abreviatura de
rx/.../
.
A continuación, se muestra un ejemplo de uso típico:
palabra simbólica { \ w + } frase de regla { [\, ] * \. } si $ cadena ~~ / \ n / { ...}
Modificadores
Los modificadores se pueden colocar después de cualquiera de las palabras clave de expresiones regulares y antes del delimitador. Si se nombra una expresión regular, el modificador viene después del nombre. Los modificadores controlan la forma en que se analizan las expresiones regulares y cómo se comportan. Siempre se presentan con un :
personaje principal .
Algunos de los modificadores más importantes incluyen:
:i
o:ignorecase
- Realizar el emparejamiento sin tener en cuenta el caso.:m
o:ignoremark
- Realizar la coincidencia sin tener en cuenta la combinación de caracteres.:g
o:global
- Realizar la coincidencia más de una vez en una cadena de destino determinada.:s
o:sigspace
- Reemplazar los espacios en blanco en la expresión regular con una regla de coincidencia de espacios en blanco, en lugar de simplemente ignorarla.:Perl5
- Trate la expresión regular como una expresión regular de Perl 5.:ratchet
- Nunca realice retrocesos en la regla.
Por ejemplo:
adición de expresiones regulares { : trinquete: sigspace \ + érmino> }
Gramáticas
Se puede definir una gramática utilizando el grammar
operador. Una gramática es esencialmente un espacio de nombres para reglas:
gramática Str :: SprintfFormat { regex format_token { \%: ? ? ón>? } índice de token { \ d + \ $ } precisión de token { ? ? } indicadores de token { <[\ +0 \ # \ -]> + } token precisión_count { [<[1-9]> \ d * | \ *]? [\. [\ d * | \ *]]? } vector de token { \ *? v } modificador de token { ll | <[lhmVqL]> } directiva de token { <[\% csduoxefgXEGbpniDUOF]> }}
Esta es la gramática utilizada para definir la sprintf
notación de formato de cadena de Perl .
Fuera de este espacio de nombres, puede usar estas reglas así:
if / / {...}
Una regla usada de esta manera es en realidad idéntica a la invocación de una subrutina con la semántica adicional y los efectos secundarios de la coincidencia de patrones (por ejemplo, las invocaciones de reglas pueden retroceder).
Ejemplos de
Aquí hay algunos ejemplos de reglas en Raku:
rx { a [ b | c ] ( d | e ) f : g } rx { ( ab * ) < { $ 1 . tamaño % 2 == 0 } > }
Ese último es idéntico a:
rx { ( ab [ bb ] * ) }
Referencias
- ^ Wall, Larry (24 de junio de 2002). "Sinopsis 5: expresiones regulares y reglas" .
- ^ Wall, Larry (4 de junio de 2002). "Apocalipsis 5: Coincidencia de patrones" .
- ^ Perl 5.10 ahora disponible - Perl Buzz Archivado 2008-01-09 en Wayback Machine
- ^ moritz (5 de mayo de 2012). "Rakudo Star 2012.05 lanzado" .
enlaces externos
- Raku Grammars : la página del manual de referencia para gramáticas.
- Tutorial de gramática - Un tutorial para gramáticas en Raku
- Sinopsis 05 - El documento de estándares que cubre las expresiones regulares y reglas de Perl 6.
- Introducción a Perl 6 Regex : introducción suave a las expresiones regulares de Perl 6.