使用带有解析的嵌套规则

时间:2013-04-17 03:34:26

标签: rebol rebol3

我正在尝试解析一些格式如下的数据。

data: [a b x b x x b a a x x b b x ]

我需要它按顺序提取a和b,并为每个a和b执行不同的操作。

预期输出为:

a
b
b
b
a
a
b
b
== true

到目前为止,我已经提出了这个问题,但它重复了一次失败了。

parse data [
  some [
    thru 'a (print "a")
    some [
      any [
        to 'b (print "b")
      ]
      to 'a
    ]
  ]
  to end
]

任何指针?感谢

3 个答案:

答案 0 :(得分:4)

我可能会遗漏某些东西......但不是你想要的东西:

 parse data [
     any [
         thru ['a (print "a") | 'b (print "b")]
     ]
     to end
 ]

生成您请求的输出。

答案 1 :(得分:4)

>> data: [a b x b x x b a a x x b b x ]
== [a b x b x x b a a x x b b x]

>> parse data [ some [ 'a (print "a") | 'b (print "b") | skip ] ]
a
b
b
b
a
a
b
b
== true

答案 2 :(得分:3)

这是tothru,你真的不需要它们。让我们在这里利用R3而不用。

parse data [
    some [
        'a (print "a")
        any [
            'b (print "b") |
            and 'a break |
            skip
        ]
    ]
    to end
]

and进行预测,break突破any规则。这可以让你在到达下一个开头时停止内循环。

tothru会跳过您不想跳过的内容,而在代码中to 'b的情况下,它实际上并没有做任何事情大多数时候。你很幸运,你包裹any的{​​{1}}循环在R3中被更改,如果它没有前进则不会继续,因为它没有前进。

至于您的第一个问题,to 'b之后的内部some应该是(print "a"),以使其成为可选项。 any不是可选的,因此对于没有中间数据的some的运行不起作用。

PARSE可能很棘手,但你可以掌握它。