我在想,如果有一種方法,從秒差距獲得TE剩餘的輸入停止解析後,無論是如果它是一個成功或失敗的解析,也許這個簽名:獲取秒差距的左輸入
parseRemaining :: Stream s Identity t => Parsec s() a -> SourceName -> s -> (s, Either ParseError a)
我們得到而不是Either ParseError a
,我們另外獲得其餘的Stream s
我在想,如果有一種方法,從秒差距獲得TE剩餘的輸入停止解析後,無論是如果它是一個成功或失敗的解析,也許這個簽名:獲取秒差距的左輸入
parseRemaining :: Stream s Identity t => Parsec s() a -> SourceName -> s -> (s, Either ParseError a)
我們得到而不是Either ParseError a
,我們另外獲得其餘的Stream s
看看Megaparsec - 秒差距的現代叉子,從版本4.2.0起它允許在解析開始提供 自定義狀態並在末尾提取解析器狀態(如果解析器成功或失敗,則它不會影響)。這允許部分解析 輸入,恢復解析,指定非標準初始文本位置, 等。參見 runParser'
和 runParserT'
。
披露:我是Megaparsec的作者之一。
我是要求使用此功能的人,我正在使用它。 – chamini2
我挖掘了一下Parsec的內部,我無法找到恢復狀態信息(包含流)的簡單方法。
臨時解決方案將檢查您收到的錯誤,然後使用其位置信息來推斷解析已停止的位置。 (當然,這隻會如果流支持尋找工作。)
考慮使用attoparsec,它速度更快並支持部分匹配。 – arrowd
我不解析大文件或類似的東西,據我所知,Parsec提供了一個更簡單的*界面*。我使用Parsec是因爲[這個答案](http://stackoverflow.com/a/19213247/1276441) – chamini2