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ímboloAtributoTipoH/S
listaAtotalAintsintetizado
listaBquedanBintheredado
listaCquedanCintheredado

La tabla de reglas sería.

ProducciónPredicadosFunciones
s ⟶ listaA listaB listaClistaB.quedanB = listaA.totalA
listaC.quedanC = listaA.totalA
listaA ⟶ AlistaA.totalA = 1
listaA ⟶ listaA1 AlistaA.totalA = listaA1.totalA + 1
listaB ⟶ BlistaB.quedanB == 1
listaB ⟶ listaB1 BlistaB1.quedanB = listaB.quedanB - 1
listaC ⟶ ClistaC.quedanC == 1
listaC ⟶ listaC1 ClistaC1.quedanC = listaC.quedanC - 1