gpt4 book ai didi

haskell - 阻止解析器接受额外字符

转载 作者:行者123 更新时间:2023-12-02 10:16:36 26 4
gpt4 key购买 nike

我有一个非常简单的解析器,具有与 Haskell 一起使用的相当标准的解析函数。我让解析器识别我想要的内容,但问题是在识别我要查找的内容后接受任何额外的输入。我将给出的简单示例代码应该识别字符串“x”,然后返回 Just 'x',或者对于除“x”之外的输入字符串不返回任何内容。给定输入“x”,它返回 Just 'x',因为它应该,给定字符串“d”,它返回 Nothing,因为它应该,给定“dx”,它返回 Nothing,因为它应该,但如果给定“xd” ”,它将返回 Just 'x',而我希望它返回 Nothing。

newtype Parser a = P (String -> [(a,String)])

instance Functor Parser where
fmap g p = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> [(g v, out)])

instance Applicative Parser where
pure v = P (\inp -> [(v,inp)])
pg <*> px = P (\inp -> case parse pg inp of
[] -> []
[(g,out)] -> parse (fmap g px) out)

instance Monad Parser where
p >>= f = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> parse (f v) out)

parse (P p) inp = p inp

item :: Parser Char
item = P (\inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)])

sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
if p x then return x else empty

empty = P (\inp -> [])

test = do { x <- sat (\x -> x == 'x'); return x}

run s = case parse test s of
[(a, _)] -> Just a
otherwise -> Nothing

给定:

run "xd"

返回:

Just 'x'

我最合理的尝试是尝试识别任何不是字母数字字符的内容,但这似乎只是使解析器尝试解析超出字符串长度的内容,并且返回 Nothing。有处理这个问题的标准方法吗?

最佳答案

修复实际上非常简单。只需在 run 函数中检查解析后剩余的字符串是否为空即可。像这样:

run s = case parse test s of
[(a, "")] -> Just a
otherwise -> Nothing

现在,任何虚假字符都会导致函数按您的意愿返回 Nothing。

另一种方法是将检查拆分到一个单独的 eof 解析器中,如果字符串为空,则该解析器成功;如果剩余任何字符,则该解析器失败,并将其添加到解析器的末尾。

关于haskell - 阻止解析器接受额外字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115949/

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