A -> B {"+" B}
Za prvým B môžu nasledovať plus a B, teda:
B(E PLUS | H_B | K);
Za druhým B môžu nasledovať opäť plus a B, pretože {} môže zabezpečiť ďalšie opakovanie (+ B + B + B...) a ak by chýbalo napr. plus, tak sa zrecoveruje vďaka tomu, že vo while sa testuje, či je aktuálny symbol z (E PLUS | H_B), nie len E PLUS.
B(E PLUS | H_B | K);
B -> C [ "-" B ]
Za C sa dáva len mínus. Nemalo by zmysel dávať do množiny aj H_B, pretože ak by sme dali aj H_B a bolo by vynechané mínus a vďaka nejakému erroru by aj prišlo k začiatku B, tak aj tak nám to nepomôže, lebo volanie B je v ife, ktorý sa celý nevykoná. (Na toto sme sa boli pýtať priamo Kollára, je to podobné ako A -> B ( c d e | f g h ) C - tu sa B zavolá s E c | E f | H_C | K.)
C(E MINUS | K);
Za posledným B už nejde nič (v tomto pravidle):
B(K);
C -> D [ "*" D ]
Podobne ako predchádzajúce:
D(E MUL | K);
D(K);
D -> value | "(" A ")"
Tu bude switch, v default bude error s K (pozor, tu mal Kollár v niektorých príkladoch chybu, dal tam aj E VALUE a E LPAR).
Za A ide len RPAR, čiže:
A(E RPAR | K);
no a potom predsa nemozes len tak dostat SEOF kym sa Ti neuzavrie zatvorka...
To SEOF musí ísť do každého erroru už len kvôli tomu, aby sa ukončil ten while v errore, keď sa narazí na SEOF. Aby si nevolal getsymbol aj vtedy, keď už nie sú dostupné ďalšie symboly.