如何在Ocaml中覆盖模块方法以获取YoJSON的JSON成员行号
问题解答
1. 能否直接撤销Yojson对Lexing模块的覆盖?
不能直接撤销。Yojson的Read模块内部静态定义了自定义的Lexing子模块,编译阶段就已经把所有内部调用绑定到了这个跳过位置更新的实现上,外部修改标准库Lexing模块不会对Yojson的内部逻辑产生任何影响。
2. 自行覆盖Lexer、重写调用逻辑的方案是否可行?
可行,且有两种成本不同的实现路径:
- 最低成本方案:直接修改Yojson源码,将
read.mll中被注释的3行位置更新代码取消注释,重新编译自定义版本的Yojson使用。仅需要修改3行代码,不需要改动任何上层调用逻辑,仅会损失原优化带来的31%解析性能,如果你对解析性能要求不高,这是最优解。 - 无源码修改方案:你可以自行实现一套完整的JSON词法分析逻辑,使用标准库的
Lexing.engine完成位置更新,再复用Yojson的语法分析能力将词法单元转换为Yojson的JSON结构,同时绑定每个节点对应的位置信息。该方案不需要修改Yojson源码,但需要你自行实现词法规则和位置绑定逻辑,工作量较大。
3. 其他获取JSON成员行号的方案
Yojson本身提供了带位置信息的扩展解析能力:你可以使用Yojson.Raw模块的相关解析接口,直接获得附带每个节点起始/结束位置的JSON结构,不需要自己修改词法逻辑。如果你的需求仅需要关联节点和行号,该方案不需要改动任何底层代码,直接调用现有接口即可。
内容的提问来源于stack exchange,提问作者ABHISHEK V ASHOK
相关产品推荐
相关产品推荐

