常見的組合子 [OQKM]

直接消耗一個符合預測的 token consume [local-0]

let consume (predict : Lexer.token) : unit =
  let tok = next_token () in
  if tok.value == predict then ()
  else
    (* raise ... *)

重複解析到失敗為止 many [local-1]

let rec many (p : unit -> 'a) () : 'a list =
  let x = catch_parse_error p in
  match x with
  | None -> []
  | Some x -> x :: many p ()

若失敗就解析第二個規則 [local-2]

let ( <|> ) (p1 : unit -> 'a) (p2 : unit -> 'a) () : 'a =
  match catch_parse_error p1 with
  | None -> p2 ()
  | Some x -> x