Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua Lpeg";“规则中的空循环”;错误_Lua_Lpeg - Fatal编程技术网

Lua Lpeg";“规则中的空循环”;错误

Lua Lpeg";“规则中的空循环”;错误,lua,lpeg,Lua,Lpeg,谁能提供一个清晰的解释和一些简单的例子来说明这个错误,显然与匹配时间捕获(Cmt)有关 我不明白我能找到的唯一提到的地方是 谢谢所以这个问题有点老了,但它是最早的搜索结果之一。互联网上没有太多关于这一点的信息,可能也不太明显出了什么问题 这个错误消息有点误导,但是现在发生的事情——用正式的PEG术语来说,至少在我的理解中是这样的——有一个重复操作符应用于一个解析表达式,它不能消耗任何输入 或者换句话说,LPeg检测到一个循环,它可以匹配一个空字符串,而这个空字符串永远不会完成。有一个称为LuL

谁能提供一个清晰的解释和一些简单的例子来说明这个错误,显然与匹配时间捕获(Cmt)有关

我不明白我能找到的唯一提到的地方是


谢谢

所以这个问题有点老了,但它是最早的搜索结果之一。互联网上没有太多关于这一点的信息,可能也不太明显出了什么问题

这个错误消息有点误导,但是现在发生的事情——用正式的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(“”)时会发生什么呢

  • 输入时剩余的字符串:“”。看看它是否与块匹配
  • 块上的剩余字符串:“”。查看它是否与表达式匹配
  • 表达式处的剩余字符串:“”。看在时间的份上,让我们说它不匹配
  • 块上的剩余字符串:“”。规则以零表达式结束,不使用输入
  • 输入时剩余的字符串:“”。消耗一个块,检查是否有更多块匹配
  • 块上的剩余字符串:“”。查看它是否与表达式匹配
  • 等等。由于V“block”与空字符串匹配,因此输入可以找到无限多的块来满足规则V“block”^0。在这种情况下,有两种很好的解决方案:将输入设置为最多一个块,或者要求块至少是一个表达式,并且在可能存在块的地方将其设置为^0。因此,要么:

    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)
    }