изменение / часть не работает должным образом с синтаксическим анализом

Согласно http://www.rebol.com/docs/core23/rebolcore-15.html

Вы можете использовать change / part для синтаксического анализа и замены, но это не работает с этим, где я просто пытаюсь заменить блок

<mytag > ... </mytag>

автор "MyString"

content:  {<mytag id="a" 111111111111111>
</mytag>
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
<mytag id="b" 22222222222222222>
</mytag>

<mytag id="c" 3333333333333>
</mytag>
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
<mytag id="d" 444444444444444>
</mytag>
}


mytag: [  to {<mytag} start: (
)
  thru {<mytag}
  to {id="} thru {id="} copy ID to {"} thru {"}
  to {</mytag>} 

  thru {</mytag>} 
  ending:

  (change/part start "mystring" ending)
  mark:
  (  write clipboard:// mark
  input)  
]

rule: [any mytag to end]

parse content rule

person Rebol Tutorial    schedule 13.04.2010    source источник


Ответы (2)


Ладислав предлагает решить эту проблему без изменения входного потока, который может иметь проблемы с производительностью и труднее отлаживать. Просто создайте свой результат отдельно. например

result: copy ""

mytag: [
  [
    copy text to {<mytag} (if text [append result text])
    thru {<mytag}
    to {id="} thru {id="} copy ID to {"} thru {"}
    thru {</mytag>} 
    (append result reform ["__" ID "__"])
  ]
  | 
  skip
]

rule: [any mytag to end]

parse content rule

result
person Gregg Irwin    schedule 14.04.2010
comment
Хорошо, спасибо, это решает непосредственную проблему, но я все еще не понимаю странный результат моего кода. И эти решения кажутся несовместимыми с другими правилами, если мне нужно? - person Rebol Tutorial; 15.04.2010
comment
Если вы добавите несколько датчиков, чтобы увидеть, где находятся «начало», «конец» и «метка», это может стать ясным. Поскольку вы меняете часть строки на подстроку другой длины, вам необходимо соответствующим образом отрегулировать позицию во вводе. например (новая-метка: изменение / начало части, окончание моей строки): новая-метка - person Gregg Irwin; 16.04.2010

Предлагаю вам взглянуть на http://en.wikibooks.org/wiki/REBOL_Programming/Language_Features/Parse#Modifying_the_input_series

person Ladislav    schedule 13.04.2010
comment
Спасибо, очень интересно, перечитаю. Тем не менее, я не понимаю, почему и как я решаю проблему синтаксического анализа, тогда как цель действительно проста? - person Rebol Tutorial; 14.04.2010