2010-08-13 79 views
3

簡單解析例如: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

UPDATE

在REBOL 3

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

回答

2

你正在尋找「組成

>> parse "aaa" compose [ some (charset [#"a" #"b"]) ] 
== true 
+0

撰寫將在這個例子中工作,但他可能會問一般能否擁有一條運行表達式的解析規則,這就是R3的DO所要做的(http://www.rebol.net/wiki/Parse_Project#DO),但我無法得到它的工作,看到我的答案... – HostileFork 2010-08-13 22:58:17

+0

非常感謝,它花了我一會兒,搞清楚,如何'撰寫'工作。順便說一句 - 是「字符集」AB「'和'字符集[#」一個「#」B「]'相當於? (我認爲後一種形式是用於範圍,如果我們插入'-') – mykhal 2010-08-13 23:35:46

+0

'>>(charset「ab」)= charset [#「a」#「b」] == true' – 2010-08-14 01:47:04

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 

據我所知,雷博爾2具有運行在解析中間的「DO」的表達,並有有效的表達式合併到規則沒有通用的方法。所以你必須使用加括號的代碼來獲取和設置單詞,然後在規則中使用這些單詞。

Rebol 3據說已經添加了DO版本,但是我找不到任何可以在當前alpha版本中工作的例子。由於在wiki上所述,我希望這回true並捕獲結果「ABC」:

>> result: none 
== none 

>> parse "abc" [copy result thru do [reverse "cba"]] 
== false 

>> result 
== none 

(這也不起作用更簡單的例子,但我想,一旦由於聲明「 DO語句可以用作COPY,SET或RETURN操作的規則參數,但並不是說它不能在其他地方使用,但它也沒有說它可以在其他地方使用 ...)

+0

感謝深分析,然而,這個分析現在已經超過了目前的穩定vesrion和我的反彈知識(我第一次看到'++' – mykhal 2010-08-13 23:30:11