有人可以向我解释一下吗?特别是:
之间的区别http://github.com/whymirror/greg和http://piumarta.com/software/peg/
前者是后者的可重入版本。
答案 0 :(得分:15)
最简单的重入解析器不使用全局变量,因此可以同时激活多个实例(不一定与线程相关,但这是我怀疑的主要用例)。
但是,在更复杂的用例中,您可以使用解析器实际解析同一源文档中的多种语言。例如,考虑一个JSP解析器,它必须解析同一文件中的Java代码和HTML。您可以制作两个解析器并在它们之间切换,而不是制作一个涵盖两种语言的大型解析器(可能非常不切实际)。但是,如果您的解析器使用它们之间的全局状态切换可能会有问题。重入解析器允许您轻松地在解析器之间切换,或者以协程的形式,或者在简单的“解析器-A调用解析器-B中嵌入代码,然后返回”情况。
已编辑添加:
如果您想要一种极端形式的可重入解析,请查看解析器组合器(如Parsec),其中“语法”中的每个子表达式都是完全独立的解析器。你可以通过组合无数小的解析器来构建一个大的解析器。
答案 1 :(得分:5)
可重入,计算机程序或 例程:
- 必须不保留静态(或全局)非常量数据。
- 不得将地址返回静态(或全局)非常量数据。
- 必须仅对呼叫者提供的数据有效。
- 不得依赖锁定单例资源。
不一定与线程安全相关,而是解析文档中的多个语法。