Esquemas de Traducción

Un esquema de traducción es una gramática independiente del contexto en la cuál se han asociado atributos a los símbolos de la gramática. Un atributo queda caracterizado por un identificador o nombre y un tipo o clase. Además se han insertado acciones, esto es, código Perl/Python/C, ...en medio de las partes derechas. En ese código es posible referenciar los atributos de los símbolos de la gramática como variables del lenguaje subyacente.

Recuerde que el orden en que se evalúan los fragmentos de código es el de un recorrido primero-profundo del árbol de análisis sintáctico. Mas específicamente, considerando a las acciones como hijos-hoja del nodo, el recorrido que realiza un esquema de traducción es:

 1     sub esquema_de_traduccion {
 2       my $node = shift;
 3 
 4       for my $child ($node->children) { # de izquierda a derecha
 5         if ($child->isa('ACTION') {
 6           $child->execute;
 7         }
 8         else { esquema_de_traduccion($child) }
 9       }
10     }

Obsérvese que, como el bucle de la línea 4 recorre a los hijos de izquierda a derecha, se debe dar la siguiente condición para que un esquema de traducción funcione:

Para cualquier regla de producción aumentada con acciones, de la forma

$ A \rightarrow X_1 \ldots X_j${ action($A{b}, $X$ _1${c}$ \ldots$ X$ _n${d})} $ X_{j+1} \ldots X_n$

debe ocurrir que los atributos evaluados en la acción insertada después de $ X_j$ dependan de atributos y variables que fueron computadas durante la visita de los hermanos izquierdos o de sus ancestros. En particular no deberían depender de atributos asociados con las variables $ X_{j+1} \ldots X_n$. Ello no significa que no sea correcto evaluar atributos de $ X_{j+1} \ldots X_n$ en esa acción.

Casiano Rodríguez León
2013-04-23