Ejemplo 645
Objetivo
El objetivo de este ejercicio es mostrar otro ejemplo de creación de una gramática que incluye tanto atributos heredados como sintetizados.
Enunciado
Supóngase un lenguaje de definición de conjuntos formados por constantes enteras.
Su característica es que, antes de indicar los elementos que lo forman, aparece una expresión que indique el valor máximo que puede tener cada elemento. Por ejemplo, en la siguiente definición todos los elementos del conjunto (4, 6 y 8) tienen que ser menores que 15 (7 + 5 + 3).
v < 7+5+3 : 4, 6, 8
La expresión sólo puede estar formada por una constante entera o bien una suma de éstas.
La GLC que describiría el lenguaje sería la siguiente:
vector ⟶ ident '<' expr ':' lista
expr ⟶ NUM
| expr '+' NUM
lista ⟶ NUM
| lista ',' NUM
Sin embargo, la gramática anterior no detecta entradas inválidas, ya que no limita el valor de los elementos del conjunto.
Se pide hacer una gramática atribuida que detecte las entradas inválidas.
Solución
La gramática atribuida sería la siguiente.
Símbolo | Atributo | Tipo | H/S |
---|---|---|---|
expr | val | int | sintetizado |
lista | limite | int | heredado |
GLC | Predicados | Funciones |
---|---|---|
vector ⟶ ident ‘<‘ expr ‘:’ lista | lista.limite = expr.val | |
expr ⟶ NUM | expr.val = NUM | |
expr ⟶ expr1 ‘+’ NUM | expr.val = expr1.val + NUM | |
lista ⟶ NUM | NUM < lista.limite | |
lista ⟶ list1 ‘,’ NUM | NUM < lista.limite | lista1.limite = lista.limite |
Supóngase la siguiente entrada:
v < 7+5+3 : 4, 6, 8
En la siguiente imagen se muestra la traza de la aplicación de la gramática atribuida a dicha entrada.