2

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

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

到目前为止,我已经想出了这个,但是重复的 a 失败了。

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

任何指针?谢谢

4

3 回答 3

4

我可能遗漏了一些东西……但这不是您想要的:

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

这会生成您请求的输出。

于 2013-04-17T04:56:56.827 回答
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
于 2013-04-17T05:05:52.913 回答
3

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

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

做了and一个前瞻,并且break打破了any规则。这可以让您在到达下一个循环的开头时停止内部循环。

toandthru会跳过你不想跳过的东西,而在to 'b你的代码中它实际上并没有做任何事情。你很幸运,any你包裹的循环to 'b在 R3 中被更改为如果它不前进就不会继续,因为它没有前进。

至于你的第一个问题,内部some应该(print "a")是一个any,使它成为可选的。不是可选的some,因此它不适用于a没有干预数据的运行。

PARSE 可能很棘手,但你会掌握它的窍门。

于 2013-04-17T05:00:53.897 回答