Lua 是用什么语法来解析的?

What type of grammar is used to parse Lua?

最近遇到LR、LL等概念,Lua属于哪一类?有没有,或者,能不能有这方面和官方代码不一样的实现?

LR、LL 等是尝试为给定语法找到解析器的算法。这对每种语法都是不可能的,您可以根据这种可能性进行分类。但是你必须知道 languagegrammar.

之间的区别

可能可以为给定的 语法 创建一个 LR(k) 解析器,对于 [=21] 的某些特定值=]k。如果是,则 grammar 是 LR(k)。请注意,LR(k) 文法也是 LR(k+1) 文法,而 LL(k )文法也是LR(k)。所以这些不是类别,因为每个语法都属于一个类别。

任何语言都可以被许多不同的语法识别。 (事实上​​,数量不限)。这些语法可以任意复杂。您总是可以为给定的甚至不是上下文无关的语言编写语法。我们说 语言 是 <X> 如果该语言存在语法 <X>。但是该语言的特定语法 not <X> 这一事实说明不了什么。

一个有趣的定理表明,如果任何语言都存在 LR(k) 文法,则可以推导出该语言的 LR(1) 文法。因此,虽然 k 参数对于描述语法很有用,但语言只能是 LR(0) 或 LR(1)。但是,LL(k) 语言并非如此。

Lua 作为一种语言基本上是 LR(1) 和 LL(2)。 grammar is part of the reference manual,除了已发布的语法没有指定运算符优先级或一些与换行有关的规则。实际的解析器是一个手写的递归下降解析器(至少,我上次看的时候是这样),有几个小偏差,以便处理运算符优先级和 LL(1) 的小偏差。但是,也存在 Lua 的 LALR(1) 解析器。