A few years later, I hope you did a good job in your homework :)
about your exercise:
decl.t and decl_tail.t are synthesized attributes that copy the type name ( ID.n ) and pass it on for each parent production in the parsing tree
when the achievement of decl -> ID decl_tail , the in_tab attribute stores a kind of list of relations between identifiers and types (the in_tab type is not clear, but we can take a list of tuples (identifier; type) ). This attribute is inherited, so the list will begin to be built in the highest release (the leftmost identifier) ββand continue to build it from left to right and complete it in the rightmost identifier.
Then the list ends when decl_tail -> : ID; is created decl_tail -> : ID; so that the synthesized attribute ( out_tab ) is used to re-synthesize the result on the start character.
this drawing was the best I could do to draw a decorated tree and graphic dependency:

The blue arrows are the synthesis of the t attribute, the green arrows are the way the in list is created, and the red arrows are the way the result is synthesized with the starting character
source share