You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现Lua手册中含间接左递归的BNF语法?

Lua语法BNF中的间接左递归处理问题

以下是Lua手册第8节中描述的Lua的BNF语法片段:

var ::=  Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name 

exp ::=  nil | false | true | Number | String | `...´ | function | 
     prefixexp | tableconstructor | exp binop exp | unop exp 

prefixexp ::= var | functioncall | `(´ exp `)´

这段语法里var和prefixexp存在递归引用,属于间接左递归。将var的定义内联后,prefixexp的定义会变为:

prefixexp ::= Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name  | functioncall | `(´ exp `)´

这种语法不能直接实现,因为左递归会导致解析过程无限循环——解析器会反复尝试匹配左递归分支,无法终止,必须先消除左递归。

消除这类左递归的常规做法是将其转换为右递归结构,比如把prefixexp拆分为基础部分和可选后缀:

prefixexp ::= primaryexp ( `[´ exp `]´ | `.´ Name )*
primaryexp ::= Name | functioncall | `(´ exp `)´

拆分后,primaryexp是无左递归的基础表达式,后面的后缀部分用重复匹配来处理原有的左递归逻辑,这样就能适配递归下降解析器的实现。

另外你提到的运算符优先级缺失问题,也需要在实现时通过分层解析来解决——比如把exp按照运算符优先级拆分为不同层级的非终结符(如exp、term、factor),确保高优先级运算符先被解析。

内容的提问来源于stack exchange,提问作者Danielo515

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:47:24