Curso de Raku / Expresiones regulares y gramáticas / Gramáticas / El árbol de análisis, make y made
make y made
En lugar de sacar los valores del árbol después, puedes adjuntar un
valor a una coincidencia mientras se analiza. Dentro
del cuerpo de un token puedes incrustar un bloque de código —
un { … } interior escrito entre el patrón — que se ejecuta
en cuanto el emparejamiento lo alcanza. Dentro de ese bloque, la función
make guarda un valor en la coincidencia actual:
grammar OneNum {
token TOP { <number> { make $<number>.Int } }
token number { \d+ }
}Cuando TOP coincide, el bloque interior
{ make $<number>.Int } se ejecuta — las llaves
exteriores son solo el cuerpo del token — y guarda el entero en la
coincidencia. Lo lees después con made (o con su alias
.ast):
say OneNum.parse('42').made; # 42Como guardamos $<number>.Int, el valor que
devuelve made es un Int de verdad: el número
en sí, no el objeto de coincidencia:
say OneNum.parse('42').made + 1; # 43Fíjate en que este + 1 en concreto daría 43
incluso sin el .Int, ya que una coincidencia se convierte
en número a partir de sus dígitos en aritmética. El sentido de llamar a
.Int es que el valor guardado sea
de verdad un número, que es lo que quieres una vez que acaba en una
estructura de datos o se pasa a otra parte, en lugar de la coincidencia
en bruto.
El valor guardado puede ser cualquier cosa: un número, una cadena, un array, un objeto. Un token también puede combinar los valores producidos por sus subtokens. Por ejemplo, sumando dos números capturados:
grammar Sum {
token TOP { <a> '+' <b> { make $<a>.Int + $<b>.Int } }
token a { \d+ }
token b { \d+ }
}
say Sum.parse('2+3').made; # 5make y made son el puente entre «coincidió»
y «aquí está el significado». Poner los bloques en línea funciona, pero
mezcla el patrón con la lógica; la sección siguiente traslada esa lógica
a una clase de
acciones aparte.
Práctica
Resuelve 1 cuestionario sobre el contenido de este tema.
Navegación del curso
← Quiz — El árbol de coincidencias | Quiz — make y made →
💪 O ve directamente a los ejercicios de esta
sección.