Curso de Raku / Expresiones regulares y gramáticas / Gramáticas / Gramáticas, clases y herencia

Tokens proto y alternativas

A veces un concepto tiene varias formas: un número puede ser un entero o un decimal. Podrías escribir una alternativa con |, pero las gramáticas ofrecen una manera más ordenada: un proto token con variantes con nombre.

Declara el token paraguas como proto token y después escribe cada variante como token nombre:sym<etiqueta>:

grammar Number {
    token TOP { <number> }

    proto token number {*}
    token number:sym<int>   { \d+ }
    token number:sym<float> { \d+ '.' \d+ }
}

say Number.parse('42').defined;   # True
say Number.parse('3.14').defined; # True

La línea proto token number {*} dice «un number es una de las variantes de abajo». Cada variante lleva una etiqueta :sym<…> que la nombra. Cuando la gramática necesita un <number>, prueba las variantes y, por emparejamiento del token más largo, elige la que encaja: int para 42, float para 3.14.

Los proto tokens se leen mejor que una larga cadena de alternativas con |, y las etiquetas :sym<…> dan a cada caso un nombre sobre el que podrás actuar más adelante, cuando adjuntes significado al análisis. Son la manera idiomática de expresar «una de estas clases» en una gramática.

Práctica

Resuelve 1 cuestionario sobre el contenido de este tema.

Quiz — Heredar gramáticas   |   Quiz — Herencia de gramáticas


💪 O ve directamente a los ejercicios de esta sección.