这就是为什么你永远不应该使用解析器组合子和 PEG

主要观点:几乎不要使用 PEG(解析表达式文法),应使用 CFG(上下文无关文法),它们更自然,能更好地表示我们的思维,决定使用哪种文法应尽早做出。CFG 和 PEG 不兼容,同一文法在不同解释下意义不同。实践中,将 CFG 文法误作 PEG 文法会导致歧义等问题,如作者在解析自己的纯类型系统检查器语法时就遇到了。即使不确定,按语言规范应使用 CFG 文法。CFG 文法又分为多种类型,它们在算法和支持的文法范围上有差异,但语义相同。在不同编程语言中,应避免使用基于 PEG 的解析器组合库,如 Rust 中的nom等,而使用基于 CFG 的解析器,如lalrpop;Haskell 中应避免使用parsec等,而使用基于 CFG 的库和解析生成器,如Earleyhappy。同时作者也宣传了自己的 Haskell 解析库,包括检查 CFG 文法是否有歧义、基于Earley的解析组合库、可逆解析的解析器和词法分析器等。还推荐了一些关于解析和 CFG 的文章,并提供了订阅博客和联系作者的方式。

关键信息:

  • PEG 几乎不用,CFG 更自然。
  • CFG 和 PEG 不兼容,决定要早。
  • 实践中 CFG 误作 PEG 会有歧义等问题。
  • 按语言规范应使用 CFG。
  • CFG 分多种类型且语义相同。
  • 不同语言应使用相应基于 CFG 的解析器。
  • 作者宣传自己的 Haskell 解析库。
  • 推荐相关文章及联系方式。

重要细节:

  • 作者用 Haskell 的Parsec解析自己的纯类型系统语法时出现歧义。
  • 提到一些关于解析和 CFG 的文章链接。
  • 作者的 Haskell 解析库的相关信息及发布情况。
  • 提供了订阅博客和联系作者的多种方式。
阅读 21
0 条评论