Ejemplo 640
Objetivo
El objetivo de este ejemplo es mostrar otra gramática con atributos heredados. En concreto, es una variante del ejercicio 610. En dicho ejercicio se planteó una solución sólo con atributos sintetizados. Ahora se presentará una solución alternativa usando atributos heredados.
Enunciado
El enunciado será el mismo que el ejercicio ejercicio 610.
Solución
La solución consistirá en contar el total de los elementos a de la entrada en un atributo sintetizado totalA. A continuación, se pasa este valor a las otras dos ramas (hacia abajo) en sus atributos heredados quedanB y quedanC respectivamente. Estos atributos indican cuántos elementos deberían quedar por visitar en dichas ramas para que la entrada sea válida. En cada nodo intermedio se resta 1. Por tanto, si el número de elementos de dicha rama coincide con la rama a, al llegar a sus nodos hoja deberían quedar por visitar sólo 1. Si en un nodo hoja quedarán por visitar más o menos de uno, su tamaño no coincidiría con la rama a.
Símbolo | Atributo | Tipo | H/S |
---|---|---|---|
listaA | totalA | int | sintetizado |
listaB | quedanB | int | heredado |
listaC | quedanC | int | heredado |
La tabla de reglas sería.
Producción | Predicados | Funciones |
---|---|---|
s ⟶ listaA listaB listaC | listaB.quedanB = listaA.totalA listaC.quedanC = listaA.totalA | |
listaA ⟶ A | listaA.totalA = 1 | |
listaA ⟶ listaA1 A | listaA.totalA = listaA1.totalA + 1 | |
listaB ⟶ B | listaB.quedanB == 1 | |
listaB ⟶ listaB1 B | listaB1.quedanB = listaB.quedanB - 1 | |
listaC ⟶ C | listaC.quedanC == 1 | |
listaC ⟶ listaC1 C | listaC1.quedanC = listaC.quedanC - 1 |