Ejemplo 635
Objetivo
El objetivo de este ejemplo es mostrar una gramática atribuida con atributos heredados y cómo se aplican para reconocer una entrada. A diferencia del ejercicio anterior, ahora se mostrará cómo se hace la gramática atribuida sobre una gramática abstracta. El motivo de hacer las dos versiones es meramente didáctico, ya que no sería necesario hacer ambas.
Enunciado
El lenguaje es el mismo que el del ejemplo anterior.
En resumen, es un lenguaje que permite definir conjuntos mediante elementos individuales o rangos. Cada elemento debe ser del tipo que se indique al principio del conjunto.
Al igual que en el ejemplo del capítulo anterior:
Crear una especificación semántica mediante una gramática atribuida.
Hacer la traza de la aplicación de la gramática atribuida a la siguiente entrada:
int v = { 2, 4—8 }
Solución
Especificación
La gramática abstracta que expresa la estructura de los AST que el sintáctico formaría en dicho lenguaje sería:
conjunto ⟶ tipo IDENT elemento*
tipoInt: tipo ⟶ ε
tipoFloat: tipo ⟶ ε
literalInt: elemento, num ⟶ string
literalReal: elemento, num ⟶ string
rango: elemento ⟶ num num
La tabla de atributos sería similar a la del caso anterior. La diferencia es que, como un AST no tiene símbolos no-terminales estructurales intermedios, se puede pasar directamente el tipo a los num.
Símbolo | Atributo | Tipo | H/S |
---|---|---|---|
tipo | val | char | sintetizado |
elemento | tipo | char | heredado |
Y la tabla de reglas sería:
Producción | Predicados | Funciones |
---|---|---|
conjunto ⟶ tipo string elemento* | elementoi.tipo = tipo.val 🏷️f1 | |
tipoInt: tipo ⟶ ε | tipoInt.val = 'i' 🏷️f2 | |
tipoFloat: tipo ⟶ ε | tipoFloat.val = 'f' 🏷️f3 | |
literalInt: elemento, num ⟶ string | literalInt.tipo == 'i' 🏷️p1 | |
literalReal: elemento, num ⟶ string | literalReal.tipo == 'f' 🏷️p2 | |
rango: elemento ⟶ num1 num2 | num1.tipo = rango.tipo 🏷️f4 num2.tipo = rango.tipo 🏷️f5 |
Traza de la Aplicación
Una vez ya hecha la especificación, ya se podría aplicar a la entrada. Para ello, habría que construir su árbol. Dado que la gramática atribuida anterior se basa en una gramática abstracta, el árbol será un AST. La siguiente imagen muestra el árbol resultante y la traza del proceso de aplicación de la gramática atribuida.
Como todos los predicados se evalúan a true, la entrada es semánticamente correcta.