LR(k)

LR 分析器是一种 自底向上 的上下文无关分析器。LR 分析器的基本操作是移位(Shift)和规约(Reduce):

  • Shift:移动 Buffer 光标。

  • Reduce:将现有的 Buffer 规约成 Token。

LR 解析器在解析过程中会发生多次 Reduce,直至将 Token 合成目标语法。在扫描过程中 LR 总是尝试合成最长的 Token。

tree-sitter 使用的就是 LR(1) 语法。

相比其他语法而言,LR 解析器较为复杂,常常需要解决 Reduce 冲突问题,但是性能一般更好。LR 解析器一般以 LR(1) 最常见。

冲突

LR 冲突分为两种,词法冲突和语法冲突。词法冲突可以通过词法优先级解决,语法冲突的解决办法有:

  • 语法优先级:通过设置语法优先级来将 Token reduce 到更高优先级的语法上。

  • 左结合和右结合:左结合和右结合代表了 Token 在合成语法时是否是贪婪的。左结合倾向于消耗更少的 Token,右结合则相反。

LL(*)

LL 分析器是 自顶向下 的上下文无关分析器。LL 分析器的基本操作是预测(Predict)和匹配(Match):

  • Predict:通过最左边的非终端字符和一定数量的 lookahead 来选择最接近目标语法的语法树。

  • Match:将最左边的终端字符和未消耗的符号进行匹配。

Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx