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 function esquema_de_traduccion(node) {
2
3 for(c in node.children) { # de izquierda a derecha
4 child = node.children[i];
5 if (child.instanceof('SemanticAction') { # si es una acción semántica
6 child.execute;
7 }
8 else { esquema_de_traduccion(child) }
9 }
10 }
Obsérvese que, como el bucle 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
{ action(A{b}, X{c} X{d})}
debe ocurrir que los atributos evaluados en
la acción insertada después de
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
. Ello no significa que
no sea correcto evaluar atributos de
en esa acción.
Por ejemplo, el siguiente esquema no satisface el requisito:
porque cuando vas a ejecutar la acción { console.log(A.in) }
el atributo A.in no ha sido computado.
Los atributos de cada símbolo de la gramática
se dividen en dos grupos disjuntos: atributos sintetizados
y atributos heredados:
Casiano Rodríguez León