stringtranslate.com

reglas de raku

Las reglas de Raku son la expresión regular , la coincidencia de cadenas y la función de análisis de propósito general del lenguaje de programación Raku , y son una parte central del lenguaje. 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, combinándolas en un marco más grande llamado reglas , que proporciona las capacidades de una gramática de expresión de análisis , además de actuar como un cierre con respecto a su alcance léxico. [1] Las reglas se introducen con la rulepalabra clave, que tiene un uso bastante similar a las definiciones de subrutinas. Las reglas anónimas se pueden introducir con la palabra clave regex(o rx), o simplemente usarse en línea como las expresiones regulares 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 de expresiones regulares actual". Entre ellos se encontraban que las expresiones regulares de Perl eran "demasiado compactas y 'bonitas'", "dependeban demasiado de muy pocos metacaracteres", "poco soporte para capturas con nombre", "poco soporte para gramáticas" y "pobre integración con elementos 'reales'". 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 que cualquier compilador basado en Parrot utilice estas herramientas para el análisis y también para proporcionar reglas a sus tiempos de ejecución.

Entre otras características de Raku, se agregó soporte para capturas con nombre 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 de Raku. [4]

Cambios desde Perl 5

Sólo hay seis características sin cambios de las expresiones regulares de Perl 5:

Algunas de las adiciones más poderosas incluyen:

Los siguientes cambios mejoran enormemente la legibilidad de las expresiones regulares:

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 anticipación positivos y negativos (?=...)y (?!...). En Raku existen estas mismas características, pero se llaman <before ...>y <!before ...>.

Sin embargo, debido a que beforepuede encapsular reglas arbitrarias, puede usarse para expresar anticipación 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 no libre de contexto :

 S   & ( A  ! B )  a +  B  A   a  A ?  segundo  segundo   segundo  segundo ?  C

En las reglas de Raku eso sería:

regla S { <antes de <A> <!antes de b>> a+ <B> } regla A { a <A>? b } regla B { b <B>? C }

Por supuesto, dada la capacidad de mezclar reglas y código normal, eso se puede simplificar aún más:

regla S { (a+) (b+) (c+) < { $0 . elementos == $1 . elementos == $2 . elementos } > }

Sin embargo, esto hace uso de aserciones , que es un concepto sutilmente diferente en las reglas de Raku, pero más sustancialmente diferente en la teoría de análisis, lo que lo convierte en un predicado semántico más que 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 cumplir la afirmació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 rutinas de 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 añadió mucha 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 ocurría en Perl 5. Esto significa que el código, incrustado en las reglas, se analiza al mismo tiempo que la regla misma y el código que la rodea. Por ejemplo, es posible anidar reglas y códigos sin volver a invocar el analizador:

regla ab {  (a.) # coincide con "a" seguida de cualquier carácter # Luego verifica si ese carácter era "b" # Si es así, imprime un mensaje. { $0 ~~ /b {decir "encontré la b"}/ }   }

Lo anterior es un único 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:

expresión regular
Una expresión regular con nombre o anónima que ignora los espacios en blanco dentro de la expresión regular de forma predeterminada.
simbólico
Una expresión regular nombrada o anónima que implica el :ratchetmodificador.
regla
Una expresión regular nombrada o anónima que implica los modificadores :ratchety :sigspace.
RX
Una expresión regular anónima que toma delimitadores arbitrarios, como //cuando la expresión regular solo toma llaves.
metro
Una forma de operador de expresión regular anónima que realiza coincidencias con delimitadores arbitrarios.
milímetros
Taquigrafía de m con el :sigspacemodificador.
s
Una forma de operador de expresión regular anónima que realiza sustitución con delimitadores arbitrarios.
ss
Taquigrafía de s con el :sigspacemodificador.
/.../
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 { <palabra> [ \, <palabra> ]* \. } si $cadena ~~ / <frase> \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 protagonista.

Algunos de los modificadores más importantes incluyen:

Por ejemplo:

 adición de expresiones regulares { :ratchet :sigspace <término> \+ <expr> }

Gramáticas

Se puede definir una gramática utilizando el grammaroperador. Una gramática es esencialmente sólo un espacio de nombres para reglas:

gramática  Str::SprintfFormat { regex format_token { \%: <índice>? <precisión>? <modificador>? <directiva> } índice del token { \d+ \$ } precisión del token { <banderas>? <vector>? <precision_count> } indicadores de token { <[\ +0\#\-]>+ } token precision_count { [ <[1-9]>\d* | \*]? [\. [ \d* | \* ] ]? } vector simbólico { \*? v } modificador de token { ll | <[lhmVqL]> } directiva de token { <[\%csduoxefgXEGbpniDUOF]> }}

Esta es la gramática utilizada para definir la notación de formato de cadenas de Perl sprintf.

Fuera de este espacio de nombres, puedes usar estas reglas así:

if / <Str::SprintfFormat::format_token> / { ... }

Una regla utilizada 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

Aquí hay algunos ejemplos de reglas en Raku:

rx { a [ b | c ] ( d | e ) f : g } rx { ( ab * ) < { $1 . tamaño % 2 == 0 } > }                        

Este último es idéntico a:

rx { ( ab [ bb ] * ) }   

Referencias

  1. ^ Wall, Larry (24 de junio de 2002). "Sinopsis 5: expresiones regulares y reglas".
  2. ^ Wall, Larry (4 de junio de 2002). "Apocalipsis 5: coincidencia de patrones".
  3. ^ Perl 5.10 ya disponible - Perl Buzz Archivado el 9 de enero de 2008 en Wayback Machine.
  4. ^ moritz (5 de mayo de 2012). "Lanzamiento de Rakudo Star 2012.05".

enlaces externos