2009-06-25 80 views
2

我如何在Treetop中做這樣的事情?Treetop/PEG中的非貪婪匹配?

/.+?;/ 

這似乎是唯一的辦法就是要做到:

[^;]+ ';' 

這是一種醜惡..任何其他方式? .+?似乎沒有工作..

+0

in'parslet'我會做'rule(:line){(str(「;」)。absent? >> any).repeat(1)>> str(「;」)}`我猜這跟你的第二個選項是一樣的。 – 2013-02-15 23:26:28

回答

0

我不知道樹梢,但會/[^;]+;/工作?


從快速搜索,我看到了建議,樹頂不做貪婪也不懶(非貪婪)量詞,那+實際上是一個佔有慾量詞(由++其他口味的正則表達式來表示)。

如果是這種情況,我不確定你有否定任何其他基於正則表達式的選項。

+0

`/ [^;] +; /`的作品,寫成`[^;] +';'`,就像我的問題所示。但我希望有更好的辦法。 – cloudhead 2009-06-25 23:53:01

1

那麼,我學會了PEGs是貪婪的,而且它沒有辦法。向前看符號可以用來雖然模仿這種行爲,就像!(';' .)

9

PEG是貪婪的,默認情況下盲目,這意味着他們吃多少投入,因爲他們可以和他們不考慮什麼來算賬:

S <- P1* P2(貪婪盲)

那可相當容易被利用的有序選擇的(和不使用向前看符號)固定,但:

S <- P1 S/P2(貪婪,非盲)

S <- P2/P1 S(懶惰,非盲)