Lua使用的语法类型是什么?

最近我遇到了LR、LL等概念。Lua属于哪个类别?在这方面有没有或者可以有与官方代码不同的实现方式?

点赞
用户1566221
用户1566221

LR、LL 等算法试图为给定的语法找到解析器。对于每个语法而言,这并不是总能成功的,可以根据实现的可能性进行分类。但您必须知道“语言”和“语法”之间的区别。

可能可以为给定的“语法”创建 LR(k) 解析器,对于某个特定的 k 值而言是这样的。如果是这样,这个“语法”就是 LR(k)。“注意,LR(k) 语法也是 LR(k +1) 语法,而 LL(k) 语法也是 LR(k) 语法。因此,这些不是指每个语法都属于且仅属于一个类别。

任何“语言”都可以通过很多不同的“语法”来进行识别(实际上,是无限的)。这些语法可以是任意复杂的。您总是可以编写一个给定语言的“语法”,即使不是上下文无关语法。如果存在一个给定语言的“语法”是“< _X_ >” ,则我们说这种“语言”是“< _X_ >”。但是,特定语言的特定语法不是“< _X_ >”时,这并不意味着什么。

有一个有趣的定理证明,如果存在任何语言的 LR(k) 语法,则有可能为该语言推导出 LR(1) 语法。因此,虽然 k 参数用于描述语法,但语言只能是 LR(0) 或 LR(1)。“LL(k) 语言”不符合这一点。

Lua 作为语言基本上是 LR(1) 和 LL(2)。其语法是参考手册的一部分,但发表的语法未指定运算符优先级或一些与换行有关的规则。实际解析器是手写的递归下降解析器(至少在我上次检查时是这样),有一些少许偏差,以处理运算符优先级和与LL(1)略有不同的细微偏差。但是,也存在适用于Lua的LALR(1)解析器。

2021-08-04 17:10:35