[翻译] Monadic parsing in Haskell
这是对 Monadic parsing in Haskell 一文的翻译。
引言(Introduction)
本文是一篇关于在 Haskell 中定义递归下降解析器(recursive descent parsers)的教程。秉持“一站式服务”的精神,文章把三个领域的材料整合到一个来源中。这三个领域分别是函数式解析器(functional parsers)(Burge, 1975; Wadler, 1985; Hutton, 1992; Fokker, 1995)、使用单子(monads)来组织函数式程序(Wadler, 1990, 1992a, 1992b),以及在 Haskell 中用于单子程序的特殊语法(Jones, 1995; Peterson 等, 1996)。更具体地说,本文展示了如何在 Haskell 中使用 do
记法(do
notation)来定义单子解析器。
当然,手写的递归下降解析器在效率上不如由工具生成的自底向上解析器(Aho 等, 1986; Mogensen, 1993; Gill 与 Marlow, 1995)。然而,对于许多研究型应用,一个简单的递归下降解析器已足够。此外,解析器生成器通常仅提供一套固定的组合子(combinators)来描述文法,而本文的方法则完全可扩展:解析器是第一类值(first-class values),我们可以充分利用 Haskell 的能力来为特定应用定义新的组合子。该方法也是展示函数式编程优雅性的一个极佳例子。
本文的目标读者是熟悉 Haskell 并且学过“文法与解析”课程的优秀本科生。具备一些函数式解析器的知识会有帮助,但不要求具备单子方面的经验。基于本文而来的一个 Haskell 库可在网页上获取: http://www.cs.nott.ac.uk/Department/Staff/gmh/bib.html#pearl(链接已失效)