2010-08-09 6 views
4

OCamlLex에서 여러 토큰을 반환하는 방법이 있습니까?ocamllex에서 여러 토큰 반환

들여 쓰기 기반 언어에 대해 렉서와 파서를 쓰려고하는데, 들여 쓰기 수준이 이전보다 낮을 때 내 렉서가 DEDENT 토큰을 여러 개 반환하도록합니다. 이렇게하면 여러 블록이 끝났을 때 구문 분석기에 알릴 수 있습니다.

이 방법을 다음, 나는이 두 토큰이 INDENTDEDENT 토큰에 의해 암시되는 바와 같이, 드롭 인 교체 BEGINEND에 관해서는 INDENTDEDENT를 사용할 수있을 것입니다.

답변

6

토큰 목록을 반환하십시오. - 파서가 기본적으로 그렇게 처리 할 수없는 경우 (예를 들어 ocamlyacc) 단지 사이에 캐시를 삽입 :

let cache = 
    let l = ref [] in 
    fun lexbuf -> 
    match !l with 
    | x::xs -> l := xs; x 
    | [] -> match Lexer.tokens lexbuf with 
      | [] -> failwith "oops" 
      | x::xs -> l := xs; x 

또는 전체 문서에 렉서를 실행 한 다음 전체 토큰 스트림 파서를 실행합니다.

자세히 알아보기 ocaml+twt을 보았습니까?

+0

감사합니다. 나는 곧 그 시도를하고, 나를 위해 그 일을 할 수 있는지 알아 보겠습니다. DEDENT 토큰이 여러 번 나타날 수있는 유일한 토큰이기 때문에 약간 성가 시겠지만, 나는 그걸 해결할 수 있습니다. –