Most grades for Assignment 5 were B's and C's, with a couple of A's. The main areas in which points were lost were in failing to document algorithms and their implementation, and in incomplete implementations of the algorithm that checked the First sets. Algorithms even of the complexity of those used for checking for (possibly indirect) left recursion and in comparing the First sets can vary considerably, especially in their implementation. It is rather difficult to understand an implementation without documentation of the algorithm, documentation of which parts of the code are implementing which parts of the algorithm. Such documentation in many cases can prevent a programmer from working with an incorrect algorithm, or an incorrect implementation. The implementation of the comparison of the First sets was incomplete, or perhaps misunderstood, by too many students. Recall that what cannot happen in a grammar for which predictive parsing is used, is that there be two rules A -> B ... and A -> C ... (that is, with the same LHS, and symbols B and C beginning the RHS), where First(B) and First(C) are not disjoint. Also recall that First(B) and First(C) are sets of terminal symbols. If x is a terminal in both First(B) and First(C), then when attempting to recognize an A, seeing an x at the beginning an input will not allow a decision between the two A rules. So for example in the simple grammar S -> A a S -> B c A -> b B -> b with start symbol S, if an input string begins with b, it's impossible to tell from just this one symbol of lookahead which S rule is to be used.