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, 48 }
    

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ímboloAtributoTipoH/S
tipovalcharsintetizado
elementotipocharheredado

Y la tabla de reglas sería:

ProducciónPredicadosFunciones
conjunto ⟶ tipo string elemento*elementoi.tipo = tipo.val 🏷️f1
tipoInt: tipo ⟶ εtipoInt.val = 'i' 🏷️f2
tipoFloat: tipo ⟶ εtipoFloat.val = 'f' 🏷️f3
literalInt: elemento, num ⟶ stringliteralInt.tipo == 'i' 🏷️p1
literalReal: elemento, num ⟶ stringliteralReal.tipo == 'f' 🏷️p2
rango: elemento ⟶ num1 num2num1.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.