我有一個簡單的解析器scriptParser
,它使用用戶狀態(類型和內容在這裏不重要)。它返回無論是對錯誤信息或Statement
列表(再次,並不重要,這是怎麼定義的)一個String
:parsec,解析後訪問最後一個用戶狀態
parseScript :: String -> Either String [Statement]
parseScript input
= let parsed = runParser scriptParser initialUserState "" input
in case parsed of
Left e -> Left (parseError input e)
Right ss -> Right ss
parseError
簡單地格式化基於e
和input
錯誤消息(它顯示的代碼片斷圍繞錯誤位置)。
我的問題是,如果我想根據最後一個可用的用戶狀態自定義錯誤信息呢?顯然用戶狀態在runParser
結束後不見了。 runParserT
後允許訪問用戶狀態嗎?
我擔心這個問題在語義上是不合格的。如果我的解析器是'(put 3 >> fail「)<|>(put 4 >> fail」「)',哪個狀態是」last「?更一般地說,如果出現錯誤,導致分支失敗的許多州中的哪一個應被視爲「最後可用」的一個,爲什麼? –
謝謝@DanielWagner。通過「最後」,我指的是失敗前的那個人,無論這可能發生在哪裏。也許我是誤解,但是因爲內部Parsec狀態是回溯,所以我認爲這是有道理的。 – cornuz
我期望在正常情況下,因爲回溯會出現*很多*失敗,每個失敗都有可能不同的「最終」狀態。目前尚不清楚這些失敗中的任何一個是否「特殊」足以保證其狀態被稱爲最終狀態。報告所有最終狀態可能在語義上是明智的,但在成功解析的情況下可能是嚴重的內存泄漏。 –