tags:

views:

28

answers:

1

Let say I have to parse a hierarchical set of tags

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

Why can't I use break inside some or any to get out of a level hierarchy ? This would allow to do that kind of parsing instead of having a headache to do so ?

I'm asking this because I read here http://www.codeconscious.com/rebol/parse-tutorial.html it would create an infinite loop

This case produces an infinite loop. Because the BREAK is within a sub-rule of the rule that SOME is processing. The BREAK does not affect success/failure status or the input pointer - it just exits a rule early:

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

+1  A: 

That gives an infinite loop in Rebol 2, you are correct. But remember that parse has undergone major upgrades and revisions in the most recent version, based on feedback of users.

So in Rebol 3, you get:

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

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

Carl wrote a bit on the nuance of Rebol 3's break behavior on the R3 blog:

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

  • fail: explicitly fail a single rule, skip to the next alternative (if it has one).
  • break: explicitly exit the entire rule block, skip all alternatives.
  • return: explicitly exit all rules, return from the parse function.

Rebol 2 is kind of set in stone at this point; there's limits to how much work is going to be done to fix it. You should test all your examples in Rebol 3.

Hostile Fork
I tried to install Rebol 3. At home it works, in the corporate client environment it doesn't.So I tried something else and I'm hitting the wall once again:http://stackoverflow.com/questions/2463412/i-thought-this-parsing-would-be-simple
Rebol Tutorial