smooooth/lib/parse.ml
2025-05-25 01:41:34 +10:00

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 '?'