| 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.