【发布时间】:2021-01-03 00:30:15
【问题描述】:
我担心 therms 之间非常重要的区别:“LL(k) 解析器”和“LL(k) 语法解析器”。当LL(1) 回溯解析器有问题时,它IS 是LL(k) 语法的解析器,因为它可以解析它们,但它的NOT LL(k) 解析器,因为它不使用k 标记从语法中的单个位置向前看,而是通过回溯可能的情况进行探索,尽管它仍然使用k 标记进行探索。
我说的对吗?
问题可能会分解为执行前瞻的方式。如果前瞻实际上仍在处理带有回溯的语法,则不会使其成为LL(k) 解析器。要成为LL(k) 解析器,解析器不能使用具有回溯机制的语法,因为那样它将是“可以解析LL(k) 语法的具有回溯的LL(1) 解析器”。
我又是对的吗?
我认为差异与 LL(1) 解析器对每个令牌使用 constant 时间的预期有关,而 LL(k) 解析器最多使用 k * constant(与前瞻线性)每个令牌的时间,不是exponential time,因为它会在回溯解析器的情况下。
更新 1:为了简化 - 每个令牌,解析 LL(k) 是否预计会相对于 k 以指数方式运行,或者相对于 k 以线性时间运行?
更新 2:我已将其更改为 LL(k),因为该问题与 k 的范围(整数或无穷大)无关。
【问题讨论】:
-
除非您精确定义回溯算法(即使这样也很难进行分析),否则无法回答有关“回溯 LL(1) 解析器”的问题。我提供了一个只讨论 LL(k) 语法的新答案;我希望它能回答您在“更新 1”中列出的问题。