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).

Historia

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]

Cambios desde Perl 5

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

  • Literales: caracteres de palabra (letras, números y guion bajo) coincidiendo literalmente
  • Captura: (...)
  • Alternativas: |
  • Escapado con barra inversa: \
  • Cuantificadores de repetición: *, +, y ?, pero no {m,n}
  • Sufijos para coincidencia mínima: *?, +?, ??

Algunas de las adiciones más poderosas son:

  • La habilidad de referenciar reglas usando <nombre_de_la_regla> para construir gramáticas enteras.
  • Un puñado de operadores que permiten al programador controlar la vuelta atrás durante las coincidencias.

Los siguientes cambios mejoran considerablemente la legibilidad de expresiones regulares:

  • Grupos de no-captura simplificados: [...], que es lo mismo que en Perl 5: (?:...)
  • Aserciones de código simplificadas: <?{...}>
  • Permite que el espacio en blanco pueda incluirse sin que coincida, permitiendo regexes multilínea. Use \ o para expresar espacio en blanco.
  • Formateado extendido de las expresiones regulares (la opción /x de Perl 5) está activa por defecto.

Cambios implícitos

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 :

S ← &(A !b) a+ B
A ← a A? b
B ← b B? c

En reglas de Raku esto sería:

rule S { <before <A> <!before b>> a+ <B> }
rule A { a <A>? b }
rule B { b <B>? c }

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

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

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.

Integración con Perl

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:

rule ab {
 (a.) # coincide con una «a» seguida de un carácter cualquiera
 # Entonces comprueba si el carácter era una «b»
 # Si es así, imprime un mensaje
 { $0 ~~ /b {say «encontrada la b»}/ }
}

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.

Implementación

Identificadores

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

regex
Una regex, anónima o no, que por defecto ignora el espacio en blanco dentro de la regex.
token
Una regex, anónima o no, que implica al modificador :ratchet.
rule
Una regex, anónima o no, que implica a los modificadores :ratchet y :sigspace.
rx
Una regex anónima que toma delimitadores arbitrarios, como por ejemplo // mientras que regex solo usa llaves.
m
Una forma de operador de regex anónima que realiza coincidencias con delimitadores arbitrarios.
mm
Abreviatura para m con el modificador :sigspace.
s
Una forma de operador de regex anónima que realiza sustitución con delimitadores arbitrarios.
ss
Abreviatura para s con el modificador :sigspace.
/.../
Colocar simplemente una regex entre barras es una abreviatura para rx/.../.

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

token palabra { \w+ }
rule frase { <palabra> [ \, <palabra> ]* \. }
if $cadena ~~ / <frase> \n / {
    ...
}

Modificadores

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:

  • :i o :ignorecase – Realiza una coincidencia sin importar el tamaño de caja.
  • :m o :ignoremark – Realiza una coincidencia sin importar la combinación de caracteres.
  • :g o :global – Realiza la coincidencia más de una vez para una cadena dada.
  • :s o :sigspace – Reemplaza el espacio en blanco en la regex con una regla de coincidencia de espacio en blanco, en lugar de simplemente ignorarlo.
  • :Perl5 – Trata la regex como una expresión regular de Perl 5.
  • :ratchet – No realizar la vuelta atrás en la regla.

Por ejemplo:

regex adición :ratchet :sigspace { <término> \+ <expresión> }

Gramática

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

grammar Str::SprintfFormat {
    regex format_token { \%: <indice>? <precision>? <modificador>? <directiva> }
    token indice { \d+ \$ }
    token precision { <indicadores>? <vector>? <contador_precision> }
    token indicadores { <[\ +0\#\-]>+ }
    token contador_precision { [ <[1-9]>\d* | \* ]? [ \. [ \d* | \* ] ]? }
    token vector { \*? v }
    token modificador { ll | <[lhmVqL]> }
    token directiva { <[\%csduoxefgXEGbpniDUOF]> }
}

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í:

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

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).

Ejemplos

Aquí hay algunos ejemplos de reglas en Raku:

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

Esta última es idéntica a:

rx { ( ab[bb]* ) }

Referencias

  1. Wall, Larry (24 de junio de 2002). «Synopsis 5: Regexes and Rules». 
  2. Wall, Larry (4 de junio de 2002). «Apocalypse 5: Pattern Matching». Archivado desde el original el 22 de agosto de 2021. Consultado el 10 de mayo de 2020. 
  3. Perl 5.10 now available - Perl Buzz
  4. moritz (5 de mayo de 2012). «Rakudo Star 2012.05 released». 

Enlaces externos

Read other articles:

Claude de BeauharnaisConte de Beauharnais et des Roches-BaritaudStemma In carica1784 –1819 PredecessoreClaude de Beauharnais Altri titoliComte de l'Empire NascitaLa Rochelle, 26 settembre 1756 MorteParigi, 10 gennaio 1819 PadreClaude de Beauharnais MadreMarie-Anne-Françoise Mouchard ConiugiClaudine de Lézay-MarnésiaSophie Fortin Duplessis FigliAlbéricStefaniaJosephine ReligioneCattolicesimo Claude de Beauharnais (26 settembre 1756 – 10 gennaio 1819) è stato un politico fra...

 

Coal-fired power station in Jefferson County, Ohio W. H. Sammis Power PlantState Route 7 passes under the Sammis Power PlantCountryUnited StatesLocationStratton, Jefferson County, OhioCoordinates40°31′48″N 80°37′51″W / 40.53000°N 80.63083°W / 40.53000; -80.63083StatusOperationalCommission dateUnits 1–2: 1960Units 3–4: 1962Unit 5: 1967Unit 6: 1969Unit 7: 1971Decommission dateUnits 1–4: May 31, 2020; Units 5–7: May 3, 2023Operator(s)Energy H...

 

Two Bootle by-elections were held during 1990, for the House of Commons constituency of Bootle in Merseyside. Bootle was one of the Labour Party's safest seats, having held the seat since 1945. May by-election May 1990 Bootle by-election ← 1987 24 May 1990 1992 → Constituency of BootleTurnout50.6% ( 22.3%)   First party Second party Third party   Candidate Michael Carr James Clappison John Cunningham Party Labour Conservative Liberal Democrats Popular vote...

Restaurant in New York City The Musket RoomThe Musket Room in December 2023Restaurant informationStreet address265 Elizabeth StreetCityNew YorkStateNew YorkPostal/ZIP Code10012Coordinates40°43′26.1″N 73°59′37.8″W / 40.723917°N 73.993833°W / 40.723917; -73.993833 The Musket Room is a restaurant in New York City.[1] The restaurant originally served food inspired by the cuisine of New Zealand, but has since expanded its menu. History The restaurant ope...

 

Pulau AspenPemandangan udara dengan Jembatan Kings Avenue di belakang.GeografiLokasiDanau Burley Griffin, CanberraJumlah pulau1Titik tertinggi578 m (approx.)PemerintahanNegaraAustralia Pulau Aspen yang ada di dalam Danau Burley Griffin adalah pulau buatan yang terletak di Canberra, Wilayah Ibu Kota Australia, Australia. Pulau Aspen terletak di tenggara Cekungan Tengah Danau Burley Griffin, bersebelahan dengan Kings Park, Parkes. Pulau ini terletak di dalam area seremonial Canbe...

 

Comarca de Fátima do Sul Fátima do Sul Vicentina Jateí Municípios integrantes da Comarca de Fátima do Sul Unidade federativa  Mato Grosso do Sul Fundação Administração Segunda entrância Municípios integrantes Fátima do Sul Vicentina Jateí Comarcas limitrofes Batayporã, Ivinhema, Glória de Dourados, Deodápolis, Dourados, Caarapó e Naviraí Dados geográficos Área 2 553,419 km²[1] População 28 942 hab. Censo IBGE/2010 [2] Densidade 11,33 hab./k...

Road in Malaysia This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Port of Tanjung Pelepas Highway – news · newspapers · books · scholar · JSTOR (April 2016) (Learn how and when to remove this template message) Federal Route 177Port of Tanjung Pelepas HighwayRoute informationLength6.60 km (4.10 ...

 

Алекс Фергюсон отримав нагороду рекордні десять разів. Тренер сезону англійської Прем'єр-ліги (англ. Premier League Manager of the Season) — нагорода найкращому тренеру Прем'єр-ліги, що вручається за підсумками кожного сезону тренеру, чий внесок в успіх команди був найбільш істотний. ...

 

British medical missionary Sir Wilfred Grenfell Wilfred Grenfell and his wife in 1916 Sir Wilfred Thomason Grenfell KCMG (28 February 1865 – 9 October 1940) was a British medical missionary to Newfoundland, who wrote books on his work and other topics. Early life and education He was born at Parkgate, Cheshire, England, on 28 February 1865, the Son of Rev. Algernon Sidney Grenfell, headmaster of Mostyn House School, and Jane Georgiana Hutchison.[1] Grenfell moved to London in 1882. ...

Agricultural caste in India This article is about the community of agriculturalists. For the ruling dynasty of the Delhi Sultanate, see Lodi dynasty. For other uses, see Lodhi (disambiguation) and Lodi (disambiguation). Lodha tribe of Rajputana. (c. 1868) The Lodhi (or Lodha, Lodh) is a community of agriculturalists, found in India. There are many in Madhya Pradesh, to where they had emigrated from Uttar Pradesh.[1] The Lodhi are categorised as an Other Backward Class,[a] but ...

 

Cet article est une ébauche concernant les Jeux olympiques et l’Allemagne. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Allemagne de l'Ouest aux Jeux olympiques d'été de 1972 Code CIO BDR Lieu Munich Participation 2e Athlètes 423 Porte-drapeau Detlef Lewe MédaillesRang : 4e Or13 Arg.11 Bron.16 Total40 Historique Jeux olympiques d'été 1924 1928 1932 1936 1948 1952 1956 1960 1964 1968 1972 1976 198...

 

George Thomas Macdonald SymonsGeorge Symons in 1912, shortly after the Titanic survivors arrive in New YorkBorn(1888-02-23)23 February 1888Weymouth, England, United KingdomDied3 December 1950(1950-12-03) (aged 62)Southampton, England, UKOccupation(s)Seaman, SailorKnown forTitanic survivorMilitary careerAllegiance United KingdomService/branch Royal NavyYears of service1914–1918Battles/warsWorld War I George Thomas Macdonald Symons (23 February 1888 – 3 December 1950) wa...

Santa ZitaTubuh Santa Zita yang dimumifikasi di Basilika San Frediano, LuccaLahir1212Monsagrati or Monte Sagrati, near Lucca, Italia[1]Meninggal27 April 1272Lucca, ItaliaDihormati diGereja Katolik RomaKanonisasi1696Pesta27 April Zita (1218–1278) adalah seorang santa yang dihormati sebagai pelindung para pelayan rumah tangga.[2] Ia bekerja sebagai pelayan dalam rumah tangga seorang tukang tenun.[3] Di situ, ia bekerja selama 48 tahun.[3] Zita seorang yang beke...

 

Former German regional airline headquartered in Cologne. For the airline formerly called WDL Aviation and also operating as German Airways, see German Regional Airlines. German Airways IATA ICAO Callsign ZQ GER GERMAN EAGLE Founded1980Ceased operationsApril 21, 2020 [1]Fleet size5Parent companyZeitfracht GroupHeadquartersCologne, GermanyWebsitegermanairways.com German Airways Fluggesellschaft GmbH,[2] operating as German Airways[2] and formerly named Luftfahrtgesellsch...

 

Tirreno-Adriático 2015 DetallesCarrera50. Tirreno-AdriáticoCompeticiónUCI WorldTour 2015 2.UWTEtapas7Fechas11 – 17 de marzo de 2015Distancia total1004,3 kmPaís ItaliaLugar de inicioLido di CamaioreLugar de llegadaSan Benedetto del TrontoEquipos22Ciclistas participantes175Ciclistas finalizados138Velocidad media39,956 km/hClasificación finalGanador Nairo Quintana (Movistar Team)Segundo Bauke Mollema (Trek Factory Racing)Tercero Rigoberto Urán (Etixx-Quick Step)Puntos Peter Sagan (Tinkof...

Bis Datos generalesOrigen Glasgow, EscociaEstado ActivoInformación artísticaGénero(s) Indie popElectropopPop punkIndie rockPeríodo de actividad 1994–presenteDiscográfica(s) Chemikal UndergroundGrand RoyalspinART RecordsLookout! RecordsWiiijaPolyGramMicro Inc.Do Yourself InArtistas relacionados The KitchenData PanikItalian ElectroDirty HospitalJuno!Royal Philharmonic OrchestraCor Ysgol GlanaethwyAmbrosian ChoirWebSitio web http://www.bisnation.com/Miembros Steven ClarkJohn Cla...

 

American actress Madeline BrewerBrewer in 2017BornMadeline Kathryn Brewer (1992-05-01) May 1, 1992 (age 31)Pitman, New Jersey, U.S.Alma materAmerican Musical and Dramatic AcademyOccupationActressYears active2013–present Madeline Kathryn Brewer[1] (born May 1, 1992) is an American actress, having had recurring roles in the Netflix series Orange Is the New Black (2013) and Hemlock Grove (2014–2015). She stars as Janine Lindo in the Hulu series The Handmaid's Tale (201...

 

Emirate in Northern Nigeria Empire's Palace Bichi Bichi Emirate is a Hausa traditional emirate in Kano State in Northern Nigeria. Its palace is located in the town of Bichi, Bichi Local Government Area. The Bichi Emirate was established in 2019, when the Kano State Government created four emirates from the oldest kingdom of Kano. The Bichi emirate consists of 9 Local Government Areas of Kano State. These local governments are Bichi, Bagwai, Shanono, Tsanyawa, Kunchi, Makoda, Dambatta, Dawakin...

Annual race in Italy held since 1984 Florence MarathonFlorence's architecture features prominently – Piazza Santa Croce is the finishing pointDateLate NovemberLocationFlorence, ItalyEvent typeRoadDistanceMarathonPrimary sponsorAsicsEstablished1984 (40 years ago) (1984)Course recordsMen: 2:08:41 (2006) James KuttoWomen: 2:24:17 (2018) Lonah SalpeterOfficial siteFlorence MarathonParticipants3,751 finishers (2021)5,792 (2019)7,606 (2018) The Florence Marathon (Italian: Maratona d...

 

2024MMXXIV noviembre diciembre enero s L M X J V S D 48.ª 25 26 27 28 29 30 1 49.ª 2 3 4 5 6 7 8 50.ª 9 10 11 12 13 14 15 51.ª 16 17 18 19 20 21 22 52.ª 23 24 25 26 27 28 29 1.ª 30 31 1 2 3 4 5 Ir al mes actual ActualizarLista de los días del añoMás calendarios El 23 de diciembre es el 357.º (tricentésimo quincuagésimo séptimo) día del año en el calendario gregoriano y el 358.º en los años bisiestos. Quedan 8 días para finalizar el año. Acontecimientos 1235: En el marco de ...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!