A -> (B|Cd) e {F} --------------------- void A(K) { check("...", HB|HC|(E e)|HF|K); switch (symbol) { case HB: B((E e)|HF|K); break; case HC: C((E d)|(E e)|HF|K); if (symbol == d) getsymbol(); else error("...", (E e)|HF|K); break; default: error("...", (E e)|HF|K); } if (symbol == e) getsymbol(); else error("..." HF|K); check("...", HF|K); while ((E symbol) & HF) { F(HF|K); check("...", HF|K); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A -> B { c D } ------------------ void A(K) { B((E c)|HD|K); check("...", (E c)|HD|K); while ((E symbol) & ((E c)|HD)) { if (symbol == c) getsymbol(); else error("...", (E c)|HD|K); D(c|HD|K); check("...", (E c)|HD|K); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A -> b (C | D) ----------------- void A(K) { if (symbol == b) getsymbol(); else error("...", HC|HD|K); check("...", HC|HD|K); switch (symbol) { case HC: C(K); break; case HD: D(K); break; default: error("...", K); } }