Rebol 2解析与Rebol 3的INTO行为差异

时间:2013-01-25 16:23:05

标签: parsing rebol

Rebol的INTO允许解析器下降到一个序列类型(例如BLOCK!或PAREN!),以将匹配规则应用于块的内容。这是Rebol 3中的一个简单示例:

data: [(a b)]

parse data [into [pos: 'a 'b (
    probe pos
    either pos = (first data) [
        print rejoin ["equal to original " mold first data]
    ] [
        print rejoin ["not equal to original " mold first data]
    ]
)]]

由于块中唯一的内容是带括号的系列,因此INTO规则会立即匹配。使用SET-WORD !,解析器被告知在pos中进入括号后捕获位置。 A和B匹配为文字LIT-WORD!s,然后执行随后的代码。预期结果发生:

(a b)
equal to original (a b)

那很好。但奇怪的是,Rebol 2将parens转换为相同代码的块:

[a b]
not equal to original (a b)

如果输入为data: [a/b],则会发生相同的块转换:

[a b]
not equal to original a/b

为什么会这样?如果您使用的是Rebol 2,有没有办法获得Rebol 3的行为?

1 个答案:

答案 0 :(得分:2)

这是卡尔发现的一个奇怪的地方"在R2。因此,他在R3中用更可期待的行为取而代之。奇怪的是,你获得这种方式的块与paren相同! (只是尝试更改内容),但声明它有不同的类型。但是,如果您需要参考R2中的paren,您的代码可以轻松调整:

data: [(a b)]

parse data [pos: into ['a 'b (
    pos: first pos
    probe pos
    either pos = (first data) [
        print rejoin ["equal to original " mold first data]
    ] [
        print rejoin ["not equal to original " mold first data]
    ]
)]]

另一种可以提供所需结果的修改:

data: [(a b)]
parse data [set pos into ['a 'b] (
    probe pos
    either pos = (first data) [
        print rejoin ["equal to original " mold first data]
    ] [
        print rejoin ["not equal to original " mold first data]
    ]
)]