Parsing rebol解析问题

Parsing rebol解析问题,parsing,syntax,rebol,Parsing,Syntax,Rebol,简单解析示例: 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 更

简单解析示例:

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

更新

在rebol 3中:

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

你在找“作曲”

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

在解析方言中,括号用于计算表达式。然而,评估的结果并没有成为解析规则的一部分。这是经过设计的,因此您可以使用此样式:

>> count: 0
== 0

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

>> count
== 2
让评估成为解析规则的一部分是另一个用例。有些实例(如您的实例)适合编写,因为它们只对表达式求值一次。但我计算比赛的表情会出错:

>> 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”表达式,并将表达式有效地合并到规则中。因此,您必须使用括号中的代码来获取和设置单词,然后在规则中使用这些单词

Rebol3应该已经添加了一个版本的,但我找不到任何在当前alpha版本中工作的示例。正如wiki上所描述的,我希望它返回
true
,并捕获结果“abc”:


(它也不适用于更简单的示例。但我曾经尝试过这样做,因为有一条语句“DO语句可以用作复制、设置或返回操作的规则参数。它没有说它不能用于其他地方,但也没有说它可以用于其他地方…”

您真正想要的可能是

>> parse "aaa" [(ab: charset "ab")  some ab]
== true

在解析表达式的开头定义一个单词,并将该单词用作规则的一部分,稍后编写将在本例中使用。但他可能会问,运行表达式时生成解析规则片段的一般能力。这就是R3的目的(),但我没能让它工作,看看我的答案…多谢了,我花了一点时间才弄明白
组合
是如何工作的。顺便说一句-are
charset“ab”
charset[#“a”#“b”]
等价物?(如果我们插入
-
>(charset“ab”)=charset[#“a”#“b”]==真的
感谢您的深入分析,但这与当前稳定的vesrion和我的rebol知识有关(我第一次看到
++
>> parse "aaa" [(ab: charset "ab")  some ab]
== true