如何正确实现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
相关产品推荐
相关产品推荐

