简单的解析示例:
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)
我使用REBOL 2.7.7.4.2
更新
in rebol 3:
parse "aaa" [some (charset "ab")]
; == false
答案 0 :(得分:2)
您正在寻找'撰写
>> parse "aaa" compose [ some (charset [#"a" #"b"] ) ]
== true
答案 1 :(得分:2)
在解析方言中,括号评估表达式。然而,评估的结果不会成为解析规则的一部分。这是设计的,所以你可以用这种方式工作:
>> 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的版本,但我找不到任何适用于当前alpha版本的示例。如维基上所述,我希望这会返回true
并捕获结果“abc”:
>> result: none
== none
>> parse "abc" [copy result thru do [reverse "cba"]]
== false
>> result
== none
(它也不适用于更简单的例子。但是由于声明“DO语句可以用作COPY,SET或RETURN操作的规则参数,我尝试了一次。它没有说明不能在其他地方使用,但它也没有说可以在其他地方使用 ...)
答案 2 :(得分:0)
您真正寻找的可能是
>> parse "aaa" [(ab: charset "ab") some ab]
== true
首先在解析表达式内定义一个单词,然后将该单词用作规则的一部分