As usual, spend up to 30 minutes on this. The first part should help you think about Lab 3; the second will help you think about Lab 4. The grammar below matches simple expressions involving "let": P -> E E -> let Decs in E E -> E + E E -> id E -> num Decs -> D D -> D , Decs D -> id := E for example, it matches let x = (let a = 7 in a + b), z = x in x + y as shown in lecture, we can synthesize the attributes "declared" for D and Decs and "free" for E, D, and Decs to detect variables that are used without being properly declared in P. 1) Using only the synthesized attributes above (as defined by the attribute grammar from the 2/19 lecture), appropriately label all nodes in the parse tree for either the example expression above or the one from class (they're supposed to be essentially the same). 2) See if you can develop a set of definitions for the attribute "declared" for D and Decs and "available" for E, D, and Decs so that each E, D, and Decs node will be labelled with the set of variables that _could_ be used legally at that node. (Thus, for any E->id node for which id is not in E.available, we would produce an error message.)