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
 |