解析和突破:为什么突破不能用于摆脱“任何”或“某些”规则?

时间:2010-03-16 19:53:30

标签: rebol

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

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

为什么我不能在某些或任何内部使用break来超出级别层次结构?这样可以进行那种解析而不是头疼吗?

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

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

  
    

规则到中断:[(打印“休息”)休息]     == [(打印“休息”)休息]     解析“X”[某些[规则到破]“X”]               ...          (逃逸)

  

1 个答案:

答案 0 :(得分:2)

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

所以在Rebol 3中,你得到:

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

>> parse "X" [some [rule-to-break] "X"]
Break
== true
卡尔写了一篇关于Rebol 3在R3博客上的突破行为的细微差别:

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

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

Rebol 2在这一点上是一成不变的;修复它需要做多少工作是有限的。您应该在Rebol 3中测试所有示例。