2011-04-24 15 views
10

Los compiladores analizan el código fuente y crean un árbol de sintaxis abstracto. Las funciones utilizadas para construir un árbol de sintaxis abstracta devuelven punteros que constituyen atributos sintetizados. ¿Qué son y cómo difieren de atributos heredados.?¿Qué son los atributos sintetizados en el contexto de la creación de un árbol de sintaxis abstracto?

editar: No sé si esto puede ayudar, pero originalmente escuché de estos términos en un contexto francés: Attributs synthétisés, attributs hérités.

Respuesta

19

Los atributos son valores adicionales asociados con algo de interés central. En el caso de los AST, puede pensar en ellos como pares (nombre_atributo, valor_atributo) asociados con cada nodo AST, donde el nombre del atributo corresponde a un tipo de hecho interesante, y el valor del atributo corresponde al estado real de ese hecho (por ejemplo , "(constants_in_subtree_count, 12)").

hereda y sintetizado son términos para describir cómo se calculan los valores de atributo para cada nodo AST, generalmente asociada con la regla de gramática que produce el nodo AST usando sus hijos.

sintetizados atributos son aquellos cuyo valor se calcula a partir de valores de los atributos de los nodos hijos, y se están pasando hasta el árbol. A menudo, los valores de los atributos sintetizados se combinan para producir un atributo para el nodo padre. Si un nodo AST tiene dos hijos, cada uno de los cuales tiene sus propios atributos (constants_in_subtree_count, 5) y (constants_in_subtree_count, 7), al pasar esos atributos, el padre puede calcular su atributo correspondiente (constants_in_subtree_count, 12).

Heredado atributos son los que pasan del padre al hijo. Si la raíz de una función AST "sabe" que el tipo de devolución de la función es (return_type, integer) como un atributo, puede pasar el tipo de retorno a los elementos secundarios de la raíz de la función, p. al cuerpo de la función. En algún lugar en el fondo de ese árbol hay una declaración de rendimiento real; si recibe el atributo heredado (return_type, X), , puede verificar que el resultado que está computando es del tipo correcto.

En la práctica, desea poder definir conjuntos arbitrarios de atributos para nodos y pasarlos arriba y abajo para los múltiples propósitos requeridos para procesar AST (construir tablas de símbolos, construir gráficos de flujo de control, verificar tipos , computación métrica, ...). Un generador attribute grammar es un tipo de generador de analizador que tomará reglas gramaticales, conjuntos de definiciones de atributos y reglas sobre cómo calcular atributos heredados y sintetizados para los nodos involucrados en cada regla, y genera un analizador y un andador AST que calcula todo los atributos.

El valor de esta idea es que proporciona un principio de organización respaldado por la automatización, que se puede utilizar para calcular muchas cosas interesantes sobre los AST de forma regular. De lo contrario, puedes codificar todo eso usando un código ad hoc.

Nuestra DMS Software Reengineering Toolkit es un sistema de manipulación de AST (en realidad fuente-a-fuente de transformaciones de programa) que se utiliza mucho la paralelo evaluación atributo para calcular todo tipo de análisis útiles más de AST: métricas convencionales, tablas de símbolos, tipo de comprobaciones (como el verificación de tipo de retorno que describí anteriormente), control y extracción de flujo de datos del código, así como otros resultados no tan fáciles de describir pero calculados sobre subárboles ("lista de asignaciones de efectos secundarios en esta expresión"). ¿Por qué paralelo?Bueno, los cálculos de atributos en los subárboles son esencialmente independientes, por lo que el paralelismo ya está allí, y cuando se trata de árboles realmente grandes, el rendimiento es importante. DMS a menudo trata con miles de unidades de compilación, cada una produciendo un AST (posiblemente grande).

+2

Gracias por los ejemplos. Esta es una cosa clave que me ayudó a entenderlo. Algo que las diapositivas de ambos profesores y la wikipedia omitieron. – d1str0

Cuestiones relacionadas