2009-09-11 75 views

回答

3

Pyparsing是一個純Python解析庫,支持packrat解析,所以你可以看到它是如何實現的。 Pyparsing使用記憶技術來保存以前在輸入文本中特定位置的特定語法表達式的解析嘗試。如果語法涉及在該位置重試同一表達式,則會跳過昂貴的解析邏輯,並僅從記憶緩存中返回結果或異常。

這裏有更多關於pyparsing wiki的FAQ page的信息,其中還包括Bryan Ford關於packrat解析的原始論文的鏈接。

27

Packrat解析是一種提供漸近地更好的性能的方法對於parsing expression grammars(PEG);專門針對PEGs,linear time解析可以得到保證。

實質上,Packrat解析只是意味着緩存子表達式在測試時是否與字符串中的當前位置匹配 - 這意味着如果當前嘗試將字符串適配到表達式失敗,則嘗試適應其他可能的表達式可以從已經被測試過的字符串中已知的子表達式的合格/不合格中受益。

+3

糾正我,如果我錯了,但能夠嘗試在給定位置(PEG的一個功能)匹配幾個不同的非終止符號意味着無限的前瞻。這意味着您可能需要將記憶輸入的重要部分保留在內存中。對? – Honza 2011-09-07 22:17:22

+2

@Honza:這是一個經典的時間/空間折衷。你是否願意追尋N條路徑,然後才找到合適的路徑,或者你寧願潛在地沿着N條路徑同時將每條路徑放在內存中。無論哪種方式,如果你向前看得太遠,它會很糟糕,如果你沒有向前看,那就沒有成本。我相信我的2G ram lappy不會出汗,如果我先看1個標記,2個標記,3個標記......只要你不試圖解析自然語言,你應該沒問題。 – efrey 2012-12-09 20:12:10

+0

如果使用'lazy vals'(Scala Parser Combinators),那麼'packrat parsing'已經實現了嗎?換句話說,如果我使用'lazy val'來緩存已解析的標記,那麼我是否已經使用'packrat parsing'? – 2014-01-08 18:41:41