bd0bf6ea7d
Support an array that dynamically resizes itself, and replace usages of `List`, `Array`, and `Queue` with `Vec`. Change-Id: I910b140b7c1bdddae40e08f8191986dccbc6fddf Reviewed-on: https://cl.tvl.fyi/c/depot/+/7080 Tested-by: BuildkiteCI Reviewed-by: wpcarro <wpcarro@gmail.com>
47 lines
1.2 KiB
OCaml
47 lines
1.2 KiB
OCaml
(******************************************************************************
|
|
* Defines a generic parser class.
|
|
******************************************************************************)
|
|
|
|
open Vec
|
|
|
|
exception ParseError of string
|
|
|
|
type token = string
|
|
type state = { i : int; tokens : token vec }
|
|
|
|
class parser (tokens : token vec) =
|
|
object (self)
|
|
val mutable tokens = tokens
|
|
val mutable i = ref 0
|
|
|
|
method advance = i := !i + 1
|
|
method prev : token option = Vec.get (!i - 1) tokens
|
|
method curr : token option = Vec.get !i tokens
|
|
method next : token option = Vec.get (!i + 1) tokens
|
|
|
|
method consume : token option =
|
|
match self#curr with
|
|
| None -> None
|
|
| Some x as res ->
|
|
self#advance;
|
|
res
|
|
|
|
method expect (x : token) =
|
|
match self#curr with
|
|
| Some y when x = y -> self#advance
|
|
| _ -> raise (ParseError (Printf.sprintf "Expected %s" x))
|
|
|
|
method matches (x : token) : bool =
|
|
match self#curr with
|
|
| None -> false
|
|
| Some y ->
|
|
if x = y then
|
|
begin
|
|
self#advance;
|
|
true
|
|
end
|
|
else false
|
|
|
|
method exhausted : bool = !i >= Vec.length tokens
|
|
method state : state = { i = !i; tokens }
|
|
end
|