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 JavaScript/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     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

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

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 $ X \in V \cup \Sigma$ se dividen en dos grupos disjuntos: atributos sintetizados y atributos heredados:

Casiano Rodríguez León
2016-03-27