Errata

The follow list of errata applies to the 2000 and 2001 printings of the book.

Date Location Correction
2002-06-14 Page 9, line -5 Replace by "Letter stands for a lowercase or uppercase letter."
2002-06-14 Page 16, middle Replace "(such as Lisp and Smalltalk)" by "(such as Smalltalk)".
2002-06-14 Page 35, Example 2.11 Delete paragraph (b).
2002-06-14 Page 54, Exercise 2.10 Delete this exercise.
2002-02-08 Page 84, Example 4.8 Replace "the cat likes me" by "the cat sees me".
2001-02-16 Page 93, 2nd bullet point After the 1st sentence insert "The function of parseN is to parse the longest possible phrase of class N starting with currentTerminal."
2001-02-16 Page 93, after 2nd bullet point Insert new bullet point "On entry to method parseS, currentTerminal must contain the first input terminal. On exit from parseS, currentTerminal should contain a 'terminal' representing the end of the input."
2002-06-14 Page 103, Example 4.14 Replace "starting from production rule (4.11)" by "starting from production rule (4.12)".
2001-02-16 Page 104, 1st bullet point This condition for an LL(1) grammar should be "If the grammar contains X|Y and neither X nor Y can derive the empty string, starters[X] must be disjoint from starters[Y]. If the grammar contains X|Y and (say) Y can derive the empty string, starters[X] must be disjoint from the union of starters[Y] and the set of tokens that can follow X|Y in this context."
2002-06-14 Page 112, Expression ASTs Add the following classes:
public class IntegerExpression extends Expression {
   public IntegerLiteral IL;
   ...
}
public class VnameExpression extends Expression {
   public Vname V;
   ...
}
2002-06-14 Page 121, method ScanSeparator The '!' case should be indented as followed:
   case '!':
      {
         takeIt();
         while (isGraphic(currentChar))
            takeIt();
         take('\n');
      }
      break;
2001-04-27 Page 123, line -9 Replace "this.kind = k;" by "this.kind = (byte)k;".
2001-04-27 Page 124, line 10 Replace "}" by "};".
2002-06-14 Page 126, after (4.29) Replace "Substitution for V-name in (4.26a) and (4.28a)" by "Substitution for V-name in (4.26a) and (4.27a)".
2001-02-16 Page 139, Section 5.1.2, line 5 Replace "locally declared" by "globally declared".
2001-02-16 Page 151, constructor for class Type Delete "static". Replace all three occurrences of "sort" by "kind".
2001-02-16 Page 164, line 5 Replace "Exercises 5.4 and 5.5" by "Exercises 5.3 and 5.4".
2001-02-16 Page 166, lines -9 and -8 Replace by "(5) proc put (c: Char) ~ ...;" and "(6) proc get (var c: Char) ~ ...;".
2001-04-03 Page 217, Example 6.24 In line 8 of the program, replace "i//b" by "i/b".
2001-05-14 Page 236, paragraph 2 Replace "instance method named move" by "instance method named area".
2002-06-14 Page 331, paragraphs 2-3 Replace these paragraphs by "Recursive interpretation is less common. A classic description of a Lisp interpreter (expressed in Lisp itself) may be found in McCarthy et al. (1965)."
2002-06-14 Page 359, Answer 1.4 Replace the first paragraph by "Mini-Triangle expressions: (a), (c), (d), (e). (Mini-Triangle has no functions.)".
2002-03-01 Page 400 On line 11, replace "eol()" by "\ eol()". On line -5, replace "eof()" by "\ eof()".

The authors gratefully acknowledge the help of readers who have reported errors.

If you find an error, please report it to the authors: David Watt or Deryck Brown.