rebol解析问题

时间:2010-08-13 15:54:52

标签: 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)

我使用REBOL 2.7.7.4.2

更新

in rebol 3:

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

3 个答案:

答案 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

首先在解析表达式内定义一个单词,然后将该单词用作规则的一部分