2013-04-17 45 views
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 

我想出了這個,到目前爲止,但它無法對重複的。

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

任何指針?由於

回答

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 
4

我可能失去了一些東西......但不是你想要的只是:

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

這產生您要求的輸出。

+0

謝謝你,你是正確的。我一直在想,數據是如何被構造成一個'a' _followed_ 0或更多'b's的。你的解決方案更加整潔,因爲它實際上只是說如果我得到一個'a',或者如果我得到一個'b',就這麼做,並且順序是隱含的,因爲在該系列中解析向前移動。 – johnk

+0

當然。儘管@ GrahamChiu的好一點! – HostileFork

+1

實際上,這個在Rebol 3中要好得多。儘管Graham會在Rebol 2中工作。 – BrianH

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的情況下,它實際上大部分時間都沒有做任何事情。你幸運的是你包裝了to 'bany循環在R3中被更改爲不繼續,因爲它沒有前進。

至於你的第一個問題,在(print "a")之後的內部some應該是any,以使它可選。 some不是可選的,所以它不適用於運行a而沒有中間數據。

PARSE可能會非常棘手,但您可以掌握它。

+0

謝謝Brian,非常明確的解釋。我以前沒見過'和'。這裏的文檔是否是'parse'信息的最新源代碼?http://www.rebol.com/r3/docs/functions/parse.html – johnk

+0

其他答案可以工作,但不要嵌套循環的事情,所以他們不真正回答你的問題。不過,如果你真的不需要知道如何做嵌套循環,那麼他們將工作! – BrianH