トークンのリストがすでにある場合は、醜い方法で字句解析バッファーを完全に無視することができます。結局のところ、パーサーが期待するparse-from-lexbuf関数は、純粋でない関数です。
let my_tokens = ref [ (* WHATEVER *) ]
let token lexbuf =
match !my_tokens with
| [] -> EOF
| h :: t -> my_tokens := t ; h
let ast = Parser.parse token (Lexbuf.from_string "")
一方、コメントから、パーサーの署名Lexing.lexbuf -> token list
に適合させようとしているタイプの関数が実際にあるように見えます。Lexing.lexbuf -> token
その場合は、キューを使用して2つのタイプ間のコンバーターを簡単に作成できます。
let deflate token =
let q = Queue.create () in
fun lexbuf ->
if not (Queue.is_empty q) then Queue.pop q else
match token lexbuf with
| [ ] -> EOF
| [tok] -> tok
| hd::t -> List.iter (fun tok -> Queue.add tok q) t ; hd
let ast = Parser.parse (deflate my_lexer) lexbuf