30 lines
962 B
OCaml
30 lines
962 B
OCaml
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 '?'
|