Jeton hata oluştuğunda dolayısıyla mevcut lexer belirteci kullanabilirsiniz, lexer tarafından oluşturulmaktadır:
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
ne ihtiyaç vardır. Diğer parçalar gerekli değil ama yararlıdır. ruleTail
, kalan tüm simgeleri, kullanıcının hata konumunu kolayca bulması için dizeye ekleyecektir. Doğru konumlar içerecek şekilde lexer'da lexbuf.Lexing.lex_curr_p
güncellenmelidir. Bu da geçer bu ayrıştırıcı baskısını bütün devletleri yapacak ve her vardiya/gerçekleştirdiği azaltmak - (source)
Harika cevap. Yine de bir sorum var: neden lexbuf.lex_curr_p 'yerine lexbuf.Lexing.lex_curr_p' kullanmak zorundayız? – GiantSquid
Çünkü 'lex_curr_p'' Lexing' modülüne aittir. Ya açmak veya OCaml daha akıllı hale gelene kadar beklemek ve niteliksiz kayıt alanı referanslarını anlamak. – ygrek
Sql_lexer'ı nerede bulabilirsiniz. ve Hata? –