토큰 목록이 이미 있다면 추한 방법으로 가서 렉싱 버퍼를 모두 무시하면됩니다.
한편
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
당신 '의 기능을 가지고 : 결국, 당신의 파서가 기대하는 구문 분석-에서-lexbuf 함수는 비 순수 함수이다 파서의 Lexing.lexbuf -> token
서명에 맞춰보십시오. 이런 경우, 당신은 쉽게 두 가지 유형 사이의 변환을 작성하는 큐를 사용할 수 있습니다
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
yacc 생성 파서는'lexbuf' 상태에서 숨겨진 위치 정보에 대한 의미 론적 접근을 제공합니다. 그러므로 나는'수축 '이 효과가 있을지 확신하지 못하고 있지만 나에게 아이디어를 준다. –