Lua Lpeg";“规则中的空循环”;错误
谁能提供一个清晰的解释和一些简单的例子来说明这个错误,显然与匹配时间捕获(Cmt)有关 我不明白我能找到的唯一提到的地方是Lua Lpeg";“规则中的空循环”;错误,lua,lpeg,Lua,Lpeg,谁能提供一个清晰的解释和一些简单的例子来说明这个错误,显然与匹配时间捕获(Cmt)有关 我不明白我能找到的唯一提到的地方是 谢谢所以这个问题有点老了,但它是最早的搜索结果之一。互联网上没有太多关于这一点的信息,可能也不太明显出了什么问题 这个错误消息有点误导,但是现在发生的事情——用正式的PEG术语来说,至少在我的理解中是这样的——有一个重复操作符应用于一个解析表达式,它不能消耗任何输入 或者换句话说,LPeg检测到一个循环,它可以匹配一个空字符串,而这个空字符串永远不会完成。有一个称为LuL
谢谢所以这个问题有点老了,但它是最早的搜索结果之一。互联网上没有太多关于这一点的信息,可能也不太明显出了什么问题 这个错误消息有点误导,但是现在发生的事情——用正式的PEG术语来说,至少在我的理解中是这样的——有一个重复操作符应用于一个解析表达式,它不能消耗任何输入 或者换句话说,LPeg检测到一个循环,它可以匹配一个空字符串,而这个空字符串永远不会完成。有一个称为LuLPeg的纯Lua实现,它缺少这种特殊的检查,如果执行语法,它很容易进入无限循环 我正在修补little toy BASIC ish语言,并在以下方面存在上述问题:
grammar = P{ "input",
input = V"block"^0 * -1,
block = V"expression"^0,
-- (define expression here)
}
根输入是可选的代码块,一个块是零个或多个表达式。这是相当简单的,当然,我省略了空格处理之类的东西。但是当您调用grammar:match(“”)时会发生什么呢
grammar = P{ "input", -- blocks can be empty, input contains one (empty or otherwise) block
input = V"block" * -1,
block = V"expression"^0,
-- (define expression here)
}
或:
在第一种情况下,空字符串将匹配满足输入规则的块。在第二种情况下,一个空字符串将失败块,以零匹配块满足输入规则
我还不需要使用Cmt,但我相信旧版本的LPeg假设函数会失败或使用输入,即使Cmt调用中的规则可以匹配空字符串。最近的版本没有这个假设。你能展示导致它的代码吗?我对“Lua的域特定语言生成器”感兴趣,它在Lua(版本5.1)和Lpeg(版本0.11-2)下正确运行。我想更新它以获得更现代的版本(见第页)。很快,我将尝试用我的更新版本制作一个github fork。然后,我将在这里提供一个链接,以便您可以运行它并查看错误(如果您愿意)。谢谢。我对LPEG没有太多的经验,但是PEG中的一个普遍想法是它不支持“左递归”,如果您提供了一个这样做的语法,那就是一个错误。“规则中的空循环”听起来很像左递归。下面是我在使用另一种基于PEG的技术<;code>boost::spirit时遇到的一个例子:只是一个猜测,这是一个很好的猜测,我认为Lpeg从未接受过左递归(请参阅)。但是语法没有改变,在Lua和Lpeg的旧版本下也能正常工作。
但是语法没有改变,在Lua和Lpeg的旧版本下也能正常工作。
但是这可以从您链接的电子邮件中的这一行来解释:旧版本的Lpeg在这些情况下是“乐观”的,盲目地假设模式消耗了一些东西(因此循环是有效的)。新版本更严格,拒绝此类循环。
可能是循环始终在语法中,但在您之前实际运行的任何测试用例上都没有触发,所以您没有看到它。现在它更严格了,不会接受无效的输入。再说一次,只是猜测而已。:)
grammar = P{ "input", -- blocks must be at least one expression, root can have one
input = V"block"^0 * -1,
block = V"expression"^1,
-- (define expression here)
}