diff options
Diffstat (limited to 'users/wpcarro/scratch/compiler/parser.ml')
-rw-r--r-- | users/wpcarro/scratch/compiler/parser.ml | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/compiler/parser.ml b/users/wpcarro/scratch/compiler/parser.ml new file mode 100644 index 000000000000..dc66f2506ed3 --- /dev/null +++ b/users/wpcarro/scratch/compiler/parser.ml @@ -0,0 +1,47 @@ +(****************************************************************************** + * 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 |