Bil*_*eal 25 parsing context-free-grammar
似乎递归下降解析器不仅是最简单的解释,而且最简单的设计和维护.它们不仅限于LALR(1)语法,并且代码本身可以被凡人理解.相比之下,自下而上的解析器对它们能够识别的语法有限制,并且需要由特殊工具生成(因为驱动它们的表几乎不可能手动生成).
那么为什么自下而上(即shift-reduce)解析比自上而下(即递归下降)解析更常见?
Ira*_*ter 17
如果您选择一个功能强大的解析器生成器,您可以编写语法代码而无需担心特殊属性.(洛杉矶)LR意味着你不必担心左递归,更少担心头痛.GLR意味着您不必担心本地模糊或前瞻.
而自下而上的解析器往往非常有效.因此,一旦你付出了一些复杂机器的代价,就可以更容易地编写语法并且解析器表现良好.
你应该期望看到这种选择,只要有一些常见的编程结构:如果它更容易指定,并且表现相当好,即使机器很复杂,复杂的机器也会获胜.另一个例子是,数据库世界已经转向关系工具,尽管您可以自己手工构建索引文件.它更容易编写数据模式,更容易指定索引,并且后面有足够复杂的机器(你不必看齿轮,只需使用它们),它们可以非常快速地完成任务.原因相同.
它源于几个不同的东西.
BNF(以及语法等理论)来自计算语言学:人们研究自然语言解析.BNF是一种非常有吸引力的描述语法的方式,因此想要使用这些符号来生成解析器是很自然的.
不幸的是,自上而下的解析技术在应用于这样的符号时往往会失败,因为它们无法处理许多常见情况(例如,左递归).这使你得到LR系列,它表现良好并且可以处理语法,并且因为它们是由机器生成的,谁关心代码是什么样的?
不过你是对的:自上而下的解析器更"直观"工作,因此它们更容易调试和维护,一旦你进行了一些练习,它们就像工具生成的那样容易编写.(特别是当你进入转移/减少冲突地狱时.)许多答案谈论解析性能,但实际上,自上而下的解析器通常可以优化为与机器生成的解析器一样快.
这就是为什么许多生产编译器使用手写的词法分析器和解析器.
递归下降解析器试图假设输入字符串的一般结构,这意味着在字符串结束之前会发生大量的反复试验.这使得它们比自下而上的解析器效率低,后者不需要这样的推理引擎.
随着语法复杂性的增加,性能差异变得更大.