declare fun {NewParser Rules} proc {Parse Goal S0 S} case Goal of nil then S0=S [] G|Gs then S1 in {Parse G S0 S1} {Parse Gs S1 S} [] t(X) then S0=X|S else if {IsProcedure Goal} then {Goal}=true S0=S else Body Rs in /* Goal is a nonterminal */ Rs=Rules.{Label Goal} {ChooseRule Rs Goal Body} {Parse Body S0 S} end end end proc {ChooseRule Rs Goal Body} I={Space.choose {Length Rs}} in rule(Goal Body)={{List.nth Rs I}} end in Parse end