代码之家  ›  专栏  ›  技术社区  ›  ljs TheVillageIdiot

递归下降与生成解析器——效率

  •  8
  • ljs TheVillageIdiot  · 技术社区  · 16 年前

    在性能方面,手写的递归下降解析器(不可避免地是LL(k))与生成的LALR解析器相比如何?

    我知道LALR解析器能够处理比LL(k)多得多的语法;然而,我打算手工编写解析器,递归下降似乎是最合适的选择。出于兴趣,是否有可能手写其他类型的文字(合理易读)?

    毒品调查科 我使用的是带有尾部调用优化(F#)的函数式语言,因此(量身定制的)递归不会像其他语言那样成为问题。

    2 回复  |  直到 16 年前
        1
  •  9
  •   Yuval F    16 年前

    我认为这在很大程度上取决于你试图解析的语言。表演的另一个有时被遗忘的部分是词法分析(扫描)部分——它对表演很重要,因为它处理的是字符而不是符号。递归下降是编写解析器的良好第一次迭代,它使遵循解析语言的逻辑变得非常自然。我认为,如果解析的语言适合(没有左递归),你应该从递归下降开始。在这个阶段选择LALR进行性能优化似乎为时过早。 你可以写一个 chart parser 用手,但我怀疑这是你的意思。手工编写LALR解析器是可能的,但很乏味。

        2
  •  3
  •   munificent    16 年前

    在LALR和LL之间做出决定 演出 此时的原因听起来像是过早的优化。解析时间很少是编译器的瓶颈。如果我是你,我会根据你是更习惯自下而上还是自上而下来定义语法来做出选择。

    就我个人而言,我发现LALR语法很容易使用,F#的fsyacc集成(这就是我学习解析的方式)使得将yacc集成到你的项目中变得非常容易。