0

这是在终端中运行的 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(""))

它打印“带有 Cmt 的 FOO”。

接下来要简单得多,并且类似地打印“FOO with /”

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

print(p3:match(""))

但是,当取消注释两者中的最后一个返回捕获时p2p3后者抱怨“未找到反向引用'foo'”,而前者仍然有效。

似乎 lpeg/运算符将命名捕获清除为副作用。

有人可以给出一些解释或指出一些解释这一事实的文件吗?

4

0 回答 0