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