13

谁可以给我解释一下这个?特别是之间的区别:

http://github.com/whymirror/greghttp://piumarta.com/software/peg/

前者是后者的可重入版本。

4

2 回答 2

18

最简单的可重入解析器不使用全局变量,因此可以同时激活多个实例(不一定与线程相关,但这是我怀疑的主要用例)。

但是,在更复杂的用例中,您可以拥有一个解析器,它实际上可以解析同一源文档中的多种语言。例如,考虑一个 JSP 解析器,它必须在同一个文件中解析 Java 代码和 HTML。您可以制作两个解析器并在它们之间切换,而不是制作一个涵盖两种语言的大型解析器(这可能非常不切实际)。但是,如果您的解析器在它们之间使用全局状态切换可能会出现问题。可重入解析器允许您轻松地在解析器之间切换,无论是以协程的形式还是简单的“解析器 A 调用解析器 B 以获取嵌入式代码然后返回”的情况。


编辑添加:

如果您想要一种极端形式的重入解析,请查看解析器组合器(如 Parsec),其中“语法”中的每个子表达式完全是一个单独的解析器。您通过组合无数的小型解析器来构建一个大型解析器。

于 2010-03-14T06:10:03.723 回答
6

来自维基

可重入,计算机程序或例程:

  • 必须不保存静态(或全局)非常量数据。
  • 不得将地址返回给静态(或全局)非常量数据。
  • 必须仅对调用者提供给它的数据起作用。
  • 不能依赖锁来锁定单例资源。

不一定与线程安全有关,而是解析文档中的多个语法。

于 2010-03-14T06:39:01.887 回答