假设我有一个模块 A,它覆盖了模块 B 中的一些方法。我希望模块 A 通过覆盖 B 或其他方式来防止模块 A 中的这种覆盖。
我需要这个来从 YoJSON 获取行号。我尝试使用其他解析器,但它们没有 YoJSON 那么多的功能。
YoJSON 的 read.ml 中的以下代码阻止了缓冲区中的行号
module Lexing =
(*
We override Lexing.engine in order to avoid creating a new position
record each time a rule is matched.
This reduces total parsing time by about 31%.
*)
struct
include Lexing
external c_engine : lex_tables -> int -> lexbuf -> int = "caml_lex_engine"
let engine tbl state buf =
let result = c_engine tbl state buf in
(*
if result >= 0 then begin
buf.lex_start_p <- buf.lex_curr_p;
buf.lex_curr_p <- {buf.lex_curr_p
with pos_cnum = buf.lex_abs_pos + buf.lex_curr_pos};
end;
*)
result
end
open Printf
open Lexing
来源:https ://github.com/ocaml-community/yojson/blob/master/lib/read.mll
有没有办法可以扭转这种行为?是否会再次覆盖 Lexer,然后覆盖 YoJSON 中使用 Lexer 的所有方法?
或者有没有办法用 YoJSON 或其他解析器以其他方式获取 json 成员的行号?