Extra credit (20 points)--handle both the case where the result of a condition is used as a value in a comparison or is used to jump to the then or else branch. The book has done something tricky and non-intuitive with the grammar. Specifically the grammar allows the result of a boolean condition to be used in a numerical comparison (e.g., (a or b) < c). If you use short-circuiting, then you have to differentiate between the case where the result of a condition is being used as a value in a comparison and when it is being used to jump to the then or else branch of a conditional. If you only handle the case where the result is used to jump to the then or else branch of a conditional, you can get away with using an L-attributed grammar. If you want to handle both cases, then you will need to add an inherited attribute to pass along the context (value or jump) and you will not be able to write a set of attribute rules that can be evaluated with a single left-to-right traversal of the syntax tree, which is what is required by an L-attributed grammar.