为啥自底向上的parser很难手写

因为不像prolog,几乎所有其他语言都不支持回溯,所以你写parser自然就只能人肉回溯,变成自底向上的样子。

■网友
泻药,我处理过ASMParser ? D38029 Override ParseDirective 动机是为了GCC兼容 如何让LLVM更GCC compatible? 回到该问题,我并不知道如何bottom up来parse(例如)这个测试用例:llvm-mirror/llvm 我对寄存器分配 xiangzhai/llvm 更感兴趣 :)

■网友
首先CFG的parsing是一个pushdown automaton的模拟过程。为什么自顶向下的parser很好写是因为syntax tree的构建过程和函数的调用树的结构非常的一致,函数的调用栈和实际自动机的状态栈有一对一的关系,每一次状态转移的时候栈深度的变化不超过1(函数调用或函数返回)。而自底向上的parser在做reduction时涉及到撤销并替换多个符号,怎么确定边界就是轮子哥提到的回溯了。如果也通过一对一的符号映射的话,你可以想象一下如果你函数的调用链里经常会出现返回N次是多么的反人类。
■网友
【为啥自底向上的parser很难手写】 可能写着写着就发现实现了一个新的LR parser generator。

■网友
如果文法设计得当,还是可以写自顶向下的。但是,这就意味着可能要像课上讲的那样,消除左递归什么的


    推荐阅读