Ответ для Красного и Ребола может выглядеть следующим образом
rules: [
(div-count: 0 clear rules/3/8 )
some [
mark: "<div"
(if equal? 1 div-count: div-count + 1 [
mark1: mark
] ) |
"</div>" mark2:
(
if equal? 0 div-count: div-count - 1 [
text: copy/part mark1 mark2
insert rules/3/8 [to end]
] )
[] | skip
]
]
Одна из проблем с вашими правилами состоит в том, что вы используете to
и |
(имеется в виду или) thru
, так что большинство закрывающих </div>
s будет быть пропущенным Первое совпадение <div
выполняется и до следующего открытия <div
без сравнения следующих подправил. Но курсор не движется, следующий <div
остается прежним. Вероятно, красный обнаруживает бесконечный цикл (без продвижения) и прерывает его.
Я использую динамически измененные правила вместо break
, так как break
нарушает (под) правила в Rebol, но не останавливает весь процесс синтаксического анализа, как вы можете видеть здесь.
>> parse "aaa" [(n: 0)some ["a" [break] (ask form n: n + 1) ]]
1
2
3
== true
Это отличается от Red, где он прерывает синтаксический анализ.
>> parse "aaa" [(n: 0)some ["a" [break] (ask form n: n + 1) ]]
1
== false
Таким образом, простое решение, подходящее для Red, а не для Rebol, может выглядеть так
rules: [
(div-count: 0)
some [
mark: "<div"
(if equal? 1 div-count: div-count + 1 [mark1: mark])
|
"</div>" mark2:
if (equal? 0 div-count: div-count - 1 )
[(print text: copy/part mark1 mark2 ) break]
|
skip
]
]