有没有办法检测 OCaml 代码中的冗余括号?

Is there a way to detect redundant parentheses in OCaml code?

我有兴趣检测 OCaml 代码中的冗余括号。我尝试过但没有结果的一些想法包括使用正则表达式,比较从 AST 生成的反向代码。我不知道如何继续这项任务。

有一个简单的解决方案。解析代码(使用编译器库),然后将其打印回来(再次使用编译器库)并比较结果。 compilerlibs 漂亮的打印机不会放置任何多余的括号。为了便于比较,您可以去掉所有空格,或者只计算括号的个数。

有更少的繁复和更多的临时方法,例如,捕捉括号的常见误用:

  • f(x) 而不是 f x
  • (f x) * (f y),而不是 f x * f y,其中 * 是任意中缀运算符。

最后说一下通用的方法,以备学生项目需要。将比较运算符的优先级并标记具有更高优先级(绑定更紧)但仍带有括号的运算符,例如 (x * y) + z,此处 * 的优先级高于 + 但仍被分隔括号。