x
1

Reglas de Raku



Las reglas de Raku son expresiones regulares, coincidencia de patrones e interpretación de propósito general del lenguaje de programación Raku, y son una parte principal del lenguaje. Debido a que las construcciones de coincidencia de patrones han excedido, desde hace un tiempo, las capacidades formales de las expresiones regulares, la documentación de Raku se refiere a ellas exclusivamente como regexes, distanciándose el término de la definición formal.

Raku ofrece un superconjunto de las características de Perl 5 con respecto a las regexes, alojándolas en un gran entorno de trabajo llamado reglas (rules), que ofrecen las características de interpretación gramática de expresiones, así como actuar como clausura con respecto a su ámbito léxico.[1]​ Las reglas se presentan con la palabra clave rule, que tiene un uso similar a la definición de subrutinas. Las reglas anónimas se presentan con el identificador regex (o rx), o simplemente usarse en línea como las regexes de Perl 5 por medio de los operadores m (coincidencia) o s (sustitución).

En Apocalipsis 5, un documento que define las decisiones preliminares sobre la coincidencia de patrones en Raku, Larry Wall enumeró 20 problemas con la «actual cultura regex». Entre estos estaban ser «demasiado compactos y 'lindos'», tenían «demasiada confianza en muy pocos metacaracteres», «poco soporte para las capturas con nombre», «poco soporte para las gramáticas», y «escasa integración con [el] lenguaje 'real'».[2]

Entre el final de 2004 y mediados de 2005, se desarrolló un compilador de reglas de Raku para la máquina virtual Parrot llamado Motor de Análisis Sintáctico (PGE), que más tarde fue reescrito a una forma más genérica, Analizador del motor gramático (Parser Grammar Engine). PGE es una combinación de tiempo de ejecución y compilador para las gramáticas Raku que permite a cualquier compilador basado en parrot usar estas herramientas para el análisis, y también ofrece reglas en tiempos de ejecución.

Además de otras características de Raku, el soporte para capturas con nombre se incorporó a Perl 5.10 en el 2007.[3]

En mayo de 2012, la referencia sobre la implementación de Raku, Rakudo, empaqueta en su distribución mensual Rakudo Star un intérprete funcional de JSON construido complementamente con reglas Raku.[4]

Sólo hay seis características que no cambian con respecto a las regexes de Perl 5:

Algunas de las adiciones más poderosas son:

Los siguientes cambios mejoran considerablemente la legibilidad de expresiones regulares:

Algunas de las características de las expresiones regulares de Perl 5 se vuelven más poderosas en Raku debido a su habilidad de encapsular las características expandidas de las reglas de Raku. Por ejemplo, en Perl 5, los operadores de cercanía positivos y negativos (?=...) y (?!...). En Raku estas mismas características existen, pero se llaman <before ...> y <!before ...>.

Además, como before puede encapsular reglas de forma arbitraria, puede usarse para expresar cercanía como un predicado sintáctico para una gramática. Por ejemplo, la siguiente expresión de análisis gramatical describe el clásico lenguaje de contexto no libre :

En reglas de Raku esto sería:

Naturalmente, dada la habilidad de mezclar reglas y código normal, esto se puede simplificar en esto:

Sin embargo, esto hace uso de las aserciones, que es un concepto ligeramente diferente de las reglas de Raku, pero sustancialmente más diferentes en teoría de análisis, creando una semántica en lugar de un predicado sintáctico. La mayor diferencia en la práctica es el rendimiento. No hay forma de que el motor de reglas conozca las condiciones en que las aserciones puedan coincidir, por lo que no se realiza ninguna optimización de este proceso.

En muchos lenguajes, las expresiones regulares son meten como cadenas, que son pasan entonces a las rutinas de las bibliotecas que las analizan y compilan en un estado interno. En Perl 5, las expresiones regulares comparten algo del analizador léxico con el escáner de Perl. Esto simplifica muchas aspectos del uso de las expresiones regulares, a pesar de añadir mucha complejidad al escáner. En Raku, las reglas son parte de la gramática del lenguaje. No existe un analizador separado para las reglas, como lo hay en Perl 5. Esto quiere decir 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 reinvocar el analizador:

Lo anterior es un único bloque de código Raku que contiene una definición exterior de una regla, un bloque interior con código de aserción, y dentro de él, una expresión regular que contiene un nivel más de aserción.

Existen distintos identificadores que se usan en conjunción con las reglas de Raku:

Aquí hay un ejemplo de un uso típico:

Los modificadores pueden colocarse después de cualquier identificador de regex, y antes del delimitador. Si una regex tiene nombre, el modificador viene después del nombre. Los modificadores controlan la forma en que las regex se analizan y cómo se comportan. Son siempre presentadas con un precedente carácter :.

Algunos de los modificadores más importantes son:

Por ejemplo:

Una gramática se puede definir usando el operador grammar. Una gramática es esencialmente un espacio de nombres para las reglas:

Esta es la gramática que se usa para definir la notación de formateo de cadenas para sprintf.

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

Una regla utilizada de esta manera es actualmente idéntica a la invocación de una subrutina con la semántica y efectos colaterales extras de la coincidencia de patrones (por ejemplo, las invocaciones de reglas pueden volver hacia atrás).

Aquí hay algunos ejemplos de reglas en Raku:

Esta última es idéntica a:



Escribe un comentario o lo que quieras sobre Reglas de Raku (directo, no tienes que registrarte)


Comentarios
(de más nuevos a más antiguos)


Aún no hay comentarios, ¡deja el primero!