2013-06-13 4 views
3

이것은 터미널 내부에서 프로토 타입을 만들 때 나는이 작업을 할 수 있기 때문에 묻는 것은 멍청한 질문입니다. 하지만 다음과 같은 특정 모듈을 사용하는 경우 :Ocaml 유형에서 필드 추출하기

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Lexing.html

이 코드 :

(*Identifiers*) 
let ws = [' ' '\t']* 
let id = ['A'-'Z' 'a'-'z'] + 
let map = id ws ':' ws id 
let feed = '{' ws map+ ws '}' 
let feeds = '[' ws feed + ws ']' 
(*Entry Points *) 
rule token = parse 
      [' ' '\t']  { token lexbuf }  (* skip blanks *) 
      | ['\n' ]  { EOL } 
      | feeds as expr { Feeds(expr) } 
      | id as expr  { Id(expr) } 
      | feed as expr { 
       let pos = Lexing.lexeme_start_p lexbuf in 
       let pos_bol = pos.pos_bol in 
       print_string (string_of_int pos_bol); 
       print_string "\n"; 
       Feed(expr) } 

나는 다음과 같은 오류가 점점 오전 :

Error: Unbound record field label pos_bol 

을 내가 가지 난처한에 대한 생각을 왜 이런 일이 일어 났습니까? 위에서 링크 된 문서에서 pos_bol은 Lexing 유형의 필드라고 말합니다.

죄송합니다. 답변을 받았을 때 오히려 분명한 답변을 드릴 것입니다.

답변

6

OCaml에서 합계 생성자와 레코드 필드 이름은 식별자와 같은 모듈 내에서 범위가 지정됩니다. position 레코드는 Lexing 안에 정의되어 있으며 현재 범위에서 열리지 않으므로 pos.pos_bol 대신 pos.Lexing.pos_bol을 사용해야합니다.

관련 문제