Rebol / Red parse: как копировать между 2 отметками - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу иметь возможность разбирать 2 оценки в правиле разбора. Для надуманного примера:

src: {a b c d e f}

rule: [
    to "b" mark1: thru "e" mark2: 
    to mark1 copy text to mark2
]

Это не работает, текст содержит «[» вместо того, что я хотел бы получить:

b c d e

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

два альтернативных решения / правила, работающие в красном

rule: [
   to "b" copy text thru "e" to end
]

и

 rule: [ to "b" collect  [keep thru "e"] to end]
 text: first parse src rule
0 голосов
/ 29 апреля 2018

Вы пытаетесь реализовать «желание» копирования с использованием PARSE. PARSE COPY ищет шаблоны, а не рассматривает серию как позиции.

Вы можете выйти в DO в середине разбора через PAREN !, он запустится, если правило разбора достигнет этой точки.

src: {a b c d e f}

rule: [
    to "b" mark1: thru "e" mark2: 
    (text: copy/part mark1 mark2)
    to end ;-- not strictly necessary, but makes PARSE return true
]

parse src rule

Это даст вам текст как b c d e

Обратите внимание, что вы не можете использовать оба способа, либо с помощью COPY, либо с TO. TO <series!> означало «искать b», а не «переходить на позицию b». Поэтому, когда вы говорите to mark1, вы вызываете другой матч. Если вы хотите установить для позиции разбора конкретную позицию , записанную в mark1, используйте :mark1 в правиле разбора.

...