我正在为一种模板语言编写一个解析器,该模板可编译为JS(如果相关)。我从几个简单的正则表达式开始,这些正则表达式似乎可以正常工作,但是正则表达式非常脆弱,因此我决定编写一个解析器。我首先编写了一个简单的解析器,该解析器通过插入/弹出堆栈来记住状态,但是事情一直在升级,直到我手上有了递归下降解析器。
不久之后,我比较了以前所有解析方法的性能。递归下降解析器是迄今为止最慢的。我被困住了:是否有必要为简单的事情使用递归下降解析器,还是我有理由采用快捷方式?我很想走一条纯正则表达式的路线,它的速度非常快(比RD解析器快三倍),但是非常笨拙,而且在一定程度上难以维护。我认为性能并不是非常重要,因为已编译的模板会被缓存,但是递归下降解析器是否适合每个任务?我想我的问题可以更多地看作是一个哲学问题:在多大程度上应牺牲性能的可维护性/灵活性?
最佳答案
递归下降解析器可能非常快。
这些通常由词法分析器组织,该词法分析器使用正则表达式识别输入到解析器的语言标记。处理源文本的大部分工作都是由词法分析器使用经常被RE编译成的疯狂的快速FSA逐个字符完成的。
与词法分析器看到字符的速率相比,解析器仅偶尔看到 token ,因此其速度通常并不重要。但是,在比较解析器到解析器的速度时,忽略了对 token 进行词法检查所需的时间,递归下降解析器可以非常快,因为它们使用功能调用实现了解析器堆栈,而这些调用与常规解析器push-current-state-相比已经非常高效在模拟堆栈上。
因此,您也可以将其做成蛋糕并食用。对词素使用正则表达式。使用解析器(任何种类的递归关系都很好)来处理词素。您应该对表演感到满意。
这种方法还满足了其他答案的观察:以使其可维护的方式编写它。我向您保证,Lexer/Parser分离可以很好地做到这一点。
关于javascript - 递归下降解析器是否简单?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5531947/