什么是可重入的解析器?

时间:2010-03-14 06:02:03

标签: parsing reentrancy

有人可以向我解释一下吗?特别是:

之间的区别

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

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

2 个答案:

答案 0 :(得分:15)

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

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


已编辑添加:

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

答案 1 :(得分:5)

From wiki

  

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

     
      
  • 必须不保留静态(或全局)非常量数据。
  •   
  • 不得将地址返回静态(或全局)非常量数据。
  •   
  • 必须仅对呼叫者提供的数据有效。
  •   
  • 不得依赖锁定单例资源。
  •   

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