open Angstrom let is_integer = function '0' .. '9' -> true | _ -> false let integer = skip_while is_integer let is_paren = function '(' .. ')' -> true | _ -> false let paren = satisfy is_paren let is_whitespace = function ' ' | '\t' -> true | _ -> false let whitespace = skip_while is_whitespace let is_newline = function '\n' | '\r' -> true | _ -> false let newline = satisfy is_newline let name = skip_while (function '-' .. 'z' | ' ' -> true | _ -> false) let is_status = function | 'R' | 'S' | 'D' | 'Z' | 'T' | 't' | 'X' | 'I' -> true | _ -> false let status = satisfy is_status let procname = paren *> name <* paren (* 8520 (smooooth) R *) let state = integer *> whitespace *> procname *> whitespace *> status <* skip_many any_char let get_state str = Angstrom.parse_string ~consume:Prefix state str |> function | Ok s -> Lwt.return s | Error e -> Printf.printf "Parser error on: %s\n..while parsing: %s" e str; Lwt.return '?'