0

假设我必须解析一组分层标签

<tag>
<subtag1 attr1=value1 attr2=value2>
<subtag1 attr1=value1 attr2=value2>
<subtag1 attr1=value1 attr2=value2>
</tag>

为什么我不能在 some 或 any 中使用 break 来脱离层次结构?这将允许进行这种解析而不是头疼吗?

我问这个是因为我在这里读到http://www.codeconscious.com/rebol/parse-tutorial.html它会创建一个无限循环

这种情况会产生一个无限循环。因为 BREAK 在 SOME 正在处理的规则的子规则内。BREAK 不会影响成功/失败状态或输入指针 - 它只是提前退出规则:

rule-to-break: [(print " Break ") break] == [(print " Break ") break] parse "X" [some [rule-to-break] "X"] Break Break ... Break Break(逃脱)

4

1 回答 1

2

这在 Rebol 2 中给出了一个无限循环,你是对的。但请记住parse,根据用户的反馈,在最新版本中进行了重大升级和修订。

所以在 Rebol 3 中,你得到:

>> rule-to-break: [(print "Break") break] 
== [(print "Break") break]

>> parse "X" [some [rule-to-break] "X"]
Break
== true

Carl 在 R3 博客上写了一点关于 Rebol 3 中断行为的细微差别:

http://www.rebol.net/r3blogs/0277.html

  • fail:明确地使单个规则失败,跳到下一个替代方案(如果有的话)。
  • break:显式退出整个规则块,跳过所有备选方案。
  • return:显式退出所有规则,从解析函数返回。

Rebol 2 在这一点上是一成不变的。修复它的工作量是有限度的。您应该在 Rebol 3 中测试所有示例。

于 2010-03-16T21:10:20.343 回答