ребол проблема разбора - PullRequest
       67

ребол проблема разбора

3 голосов
/ 13 августа 2010

простой пример разбора:

ab: charset "ab"
parse "aaa" [some ab]  
; == true

если я хотел однострочный (определить ab на месте), как мне это сделать?

parse "aaa" [some [charset "ab"]]
; ** Script Error: Invalid argument: ?function?

parse "aaa" [some (charset "ab")]
; (INTERPRETER HANGS UP)

я использую REBOL2.7.7.4.2

ОБНОВЛЕНИЕ

в реболе 3:

parse "aaa" [some (charset "ab")]
; == false

Ответы [ 2 ]

2 голосов
/ 14 августа 2010

В разборе диалектов скобки оценивают выражения. Тем не менее, результат оценки не становится частью правила разбора. Это по замыслу, так что вы можете работать в этом стиле:

>> count: 0
== 0

>> parse "aab" [while ["a" (print "Match a" ++ count)] "b"]
Match a
Match a
== true

>> count
== 2

Использование оценки становится частью правила разбора - это другой вариант использования. Некоторые экземпляры (например, ваш) подходят для COMPOSE, потому что они оценивают выражение только один раз. Но мое выражение для подсчета совпадений пошло бы не так:

>> count: 0
== 0

>> rule: compose/deep [while ["a" (print "Match a" ++ count)] "b"]
Match a
== [while ["a" 0] "b"]

>> count
== 1

>> parse "aab" rule
== false

AFAIK, Rebol 2 не имеет общего способа запускать выражения "DO" в середине синтаксического анализа и эффективно объединять выражения в правила. Поэтому вы должны использовать заключенный в скобки код для получения и установки слов, а затем использовать эти слова в правилах.

Rebol 3 предположительно добавил версию DO , но я не могу найти примеры, которые работают в текущей альфа-версии. Как описано в вики, я ожидал, что это вернет true и захватит результат "abc":

>> result: none
== none

>> parse "abc" [copy result thru do [reverse "cba"]]
== false

>> result
== none

(Он также не работает на более простых примерах. Но я однажды попробовал это сделать из-за выражения «Оператор DO можно использовать в качестве аргумента правила для операций COPY, SET или RETURN. В нем ничего не сказано» * не может быть использован в другом месте , но также не сказано, что может быть использован в другом месте ...)

2 голосов
/ 14 августа 2010

Вы ищете 'сочинить

>> parse "aaa" compose [ some (charset [#"a" #"b"] ) ]
== true
...