Solutions Question 1: For 1-22: ClassDef may be replaced by its superclass: Definition 1 Program 2 to (to-stop works too) 3 ClassDef 4 DoParse 5 DontParse 3,4,5 in any order 6 ClassDef 7 ClassDef 8 DontParse 9 DoParse 10 Program 11 to (to-stop works too) 12 BeginVisitors 13 EndVisitors 14 ClassDef 12,13,14 in any order 15 BeginVisitors 16 EndVisitors 17 ClassDef 18 ClassDef 19 Program 20 Program 21 ClassGraph 22 ClassGraphEntry_DList 23 ClassDef 24 Nothing 25 DontParse 26 ClassDef 27 BeginVisitor Question 2: see answers-raw/quest2 subdirectory Question 3: 1 ( 2 ) 3 "=" 4 ":" 5 NOTHING 6 CHOICE 7 PartKeyword 8 ReadOnlyPart 9 read-only 10 PrintCommand 11 PrintUnindent 12 - 13 List 14 S { "|" S }. Question 4: You cannot traverse to terminal classes (Ident, String, ... ) so you have to use part names to access these parts. Otherwise, yes, you could eliminate part names at the cost of introducing extra classes which basically encode the part name as a class name (to deal with the situation in which a class has several parts of the same type).