term (wd,val) (tok:toks) = [(val,toks)], if tok = wd = [], otherwise term x [] = [] (p $orelse q) toks = p toks ++ q toks (p1 $then p2) toks = [((v1,v2),t2) | (v1,t1) <- p1 toks; (v2,t2) <- p2 t1] numb = term ("one", 1) $orelse term ("two",2) $orelse term ("three",3) plus = term ("plus", (+)) add_seq = numb $orelse ((numb $then plus $then add_seq) $apply_rule app_op) (p $apply_rule f) inp = [ (f v, r) | (v, r) <- p inp ] app_op (v1, (op, v2)) = op v1 v2 example = add_seq ["one", "plus", "two", "plus", "three"]