Когда mess
обрабатывается с LOAD/MARKUP
, вы получаете это (и я отформатировал + прокомментировал с типами):
[
; string!
"^/"
; tag! string! tag!
<td> "Bob Sockaway" </td>
; string!
"^/"
; tag! tag!
; string!
; tag! tag!
<td> <a href=mailto:bsockaway@example.com>
"bsockaway@example.com"
</a> </td>
; (Note: you didn't put the anchor's href in quotes above...)
; string!
"^/"
; tag! string! tag!
<td> "9999" </td>
; string!
"^/"
]
Ваш шаблон вывода соответствует серии вида [<td> string! </td>]
, но не вещам формы [<td> tag! string! tag! </td>]
. Обойдя вопрос, поставленный в вашем заголовке, вы можете решить эту конкретную дилемму несколькими способами. Можно было бы вести подсчет того, находитесь ли вы внутри тега TD, и печатать какие-либо строки, когда число не равно нулю:
rules: [
(td-count: 0)
some [
; if we see an open TD tag, increment a counter
<td> (++ td-count)
|
; if we see a close TD tag, decrement a counter
</td> (-- td-count)
|
; capture parse position in s if we find a string
; and if counter is > 0 then print the first element at
; the parse position (e.g. the string we just found)
s: string! (if td-count > 0 [print s/1])
|
; if we find any non-TD tags, match them so the
; parser will continue along but don't run any code
tag!
]
]
В результате вы получите запрос:
Bob Sockaway
bsockaway@example.com
9999
Но вы также хотели знать, по сути, можете ли вы переходить к разбору строк из разбора блоков по тому же набору правил (без перехода в открытый код). Я посмотрел на это «смешанный анализ», похоже, что это может быть функция, рассматриваемая в Rebol 3. Тем не менее, я не мог заставить его работать на практике. Поэтому я задал свой вопрос.
Как смешать разбор строк и разбор блоков в одном правиле?