lua 5.3 lpeg: Cmt, Cb 和 / 操作符

下面是一个在终端中运行的 Lua 代码示例。它创建了一个名为“FOO”的常量捕获。

L = require('lpeg')

p1 = L.Cg(L.Cc('FOO'), 'foo')

print(L.Ct(p1):match("").foo)

它输出“FOO”,这意味着成功定义了命名捕获。

接下来可以使用回溯捕获的两种方式之一:使用“lpeg.Cmt”或“/”操作符:

p2 = p1
  * L.Cmt(
    L.Cb('foo'),
    function(_, i, c)
      return i, c.." with Cmt"
    end
  )
  -- * L.Cb('foo')

print(p2:match(""))

它输出“FOO with Cmt”。

下一个示例简单得多,同样输出“FOO with /”:

p3 = p1
  * L.Cb('foo')
  / function(c)
      return c.." with /"
    end
  -- * L.Cb('foo')

print(p3:match(""))

但是,如果取消注释 p2p3 中的最后一个回溯捕获,后者将抱怨“找不到回溯引用 'foo'”,而前者仍然工作。

似乎 lpeg 的 / 操作符会清除命名捕获的副作用。

有没有人能给出一些解释或指向一些说明这一事实的文档?

点赞