2015-09-27 57 views
5

我在想,如果有一種方法,從秒差距獲得TE剩餘的輸入停止解析後,無論是如果它是一個成功或失敗的解析,也許這個簽名:獲取秒差距的左輸入

parseRemaining :: Stream s Identity t => Parsec s() a -> SourceName -> s -> (s, Either ParseError a) 

我們得到而不是Either ParseError a,我們另外獲得其餘的Stream s

+1

考慮使用attoparsec,它速度更快並支持部分匹配。 – arrowd

+0

我不解析大文件或類似的東西,據我所知,Parsec提供了一個更簡單的*界面*。我使用Parsec是因爲[這個答案](http://stackoverflow.com/a/19213247/1276441) – chamini2

回答

0

看看Megaparsec - 秒差距的現代叉子,從版本4.2.0起它允許在解析開始提供 自定義狀態並在末尾提取解析器狀態(如果解析器成功或失敗,則它不會影響)。這允許部分解析 輸入,恢復解析,指定非標準初始文本位置, 等。參見 runParser'runParserT'


披露:我是Megaparsec的作者之一。

+0

我是要求使用此功能的人,我正在使用它。 – chamini2

1

您可以使用getInput,這是一個解析器,它返回剩餘的輸入。

+0

這將只用於獲取輸入成功的解析。無論在哪種情況下,我都希望獲得輸入。 – chamini2

0

我挖掘了一下Parsec的內部,我無法找到恢復狀態信息(包含流)的簡單方法。

臨時解決方案將檢查您收到的錯誤,然後使用其位置信息來推斷解析已停止的位置。 (當然,這隻會如果流支持尋找工作。)