토큰은 에러가 발생했을 경우에 따라서는 현재 렉서 토큰을 사용할 수 있습니다, 렉서에 의해 생성됩니다
let parse_buf_exn lexbuf =
try
T.input T.rule lexbuf
with exn ->
begin
let curr = lexbuf.Lexing.lex_curr_p in
let line = curr.Lexing.pos_lnum in
let cnum = curr.Lexing.pos_cnum - curr.Lexing.pos_bol in
let tok = Lexing.lexeme lexbuf in
let tail = Sql_lexer.ruleTail "" lexbuf in
raise (Error (exn,(line,cnum,tok,tail)))
end
Lexing.lexeme lexbuf
당신이 필요합니다. 다른 부분은 필요하지 않지만 유용합니다. ruleTail
은 나머지 모든 토큰을 문자열로 연결하여 사용자가 오류 위치를 쉽게 찾을 수있게합니다. lexbuf.Lexing.lex_curr_p
은 올바른 위치를 포함하도록 렉서에서 업데이트되어야합니다. 이 그것을 통과하는 파서 인쇄 모든 상태를 만들 것이다, 각 이동은 /는 수행 감소 - (source)
좋은 답변입니다. 나는 하나의 질문을 가지고있다 : 왜 우리는'lexbuf.lex_curr_p' 대신에'lexbuf.Lexing.lex_curr_p'를 사용해야합니까? – GiantSquid
'lex_curr_p'는'Lexing' 모듈에 속하기 때문에. OCaml을 열거 나 OCaml이 현명해질 때까지 기다리거나 부적합한 레코드 필드 참조를 이해하십시오. – ygrek
Sql_lexer는 어디서 찾을 수 있습니까? 및 오류? –