gpt4 book ai didi

haskell - 我的 parsec 解析器可以写弃用消息吗?

转载 作者:行者123 更新时间:2023-12-03 23:44:15 30 4
gpt4 key购买 nike

我有一个 DSL 和一个用 Haskell 编写的带有 Parsec 包的解析器。现在我想弃用 DSL 的特定语言功能。在下一个版本中,我希望解析器同时接受新语法和旧语法,但我希望解析器生成弃用消息。我找不到如何做到这一点。这可能吗,如果可以,如何做到这一点?

最佳答案

与其在解析过程中发出消息,不如在解析结束时返回额外的信息:是否遇到过时的语法。
ParsecT type 接受用户在解析过程中设置的状态的类型参数:

ParsecT s u m a is a parser with stream type s, user state type u, underlying monad m and return type a. Parsec is strict in the user state.


用户状态可以通过 putState 设置和 modifyState .可以使用 getState 获得.
大多数解析组合器在用户状态上是多态的。您自己的 DSL 的大多数组合器也应该如此。但是语法中不推荐使用的部分的解析器应该在您的用户状态中设置一个“标志”。
像这样的东西:
import Text.Parsec
import Text.Parsec.Char
import Data.Functor.Identity

type Parser = ParsecT [Char] Bool Identity -- using a Bool state

myParser :: Parser Char
myParser =
try (do char 'a'
putState True
char 'b')
<|>
try (do char 'a'
char 'c')

main :: IO ()
main = do
print $ runParser ((,) <$> myParser <*> getState) False "" "ab"
print $ runParser ((,) <$> myParser <*> getState) False "" "ac"
-- results:
-- Right ('b',True)
-- Right ('c',False)
当然,与其使用简单的 bool 标志,不如在状态中放入更多信息。
请注意,如果子解析器回溯,则子解析器设置的状态将被“遗忘”。这是我们目的的正确行为:否则,我们会得到由最终被丢弃的分支触发的“误报”。

parsec 的常见替代方案是 megaparsec .后者不允许用户定义状态 in the parser type itself ,但可以使用 StateT 模拟它变压器过 ParsecT 类型。

关于haskell - 我的 parsec 解析器可以写弃用消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63847118/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com