1

假设我有一个模块 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 成员的行号?

4

1 回答 1

2

模块函数不是方法。更准确地说,没有后期绑定的主题,并且永远不能被覆盖。您链接的代码隐藏了原始引擎功能。

此外,Yojson 正在计算错误消息的行号,但它们从未集成到解析的 json 中。如果不重写解析器,就无法从 Yojson 解析器中获取行号。

于 2021-11-25T16:59:18.900 回答