gpt4 book ai didi

haskell - 当我的解析器显式查找时,为什么会得到 "unexpected end of input"?

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

import Control.Applicative hiding (many)
import Text.Parsec
import Text.Parsec.String

lexeme :: Parser a -> Parser a
lexeme p = many (oneOf " \n\r") *> p

identifier :: Parser String
identifier = lexeme $ many1 $ oneOf (['a'..'z'] ++ ['A'..'Z'])

operator :: String -> Parser String
operator = lexeme . string

field :: Parser (String, String)
field = (,) <$> identifier <* operator ":" <*> identifier <* operator ";"

fields :: Parser [(String, String)]
fields = many (try field) <* eof

testInput :: String
testInput = unlines
[ " FCheckErrors : Boolean ;"
, " FAcl : TStrings ;"
]

main :: IO ()
main = parseTest fields testInput

运行时会产生:

parse error at (line 3, column 1): unexpected end of input

当我删除显式 eof 匹配时,就没有这样的解析错误:

fields = many (try field)

我还尝试了try field `manyTill` eof,但这将导致与原始代码相同的行为。

我想确保解析器消耗整个输入,我该怎么做?

最佳答案

问题在于 eof 之前有一个换行符(由 unlines 插入)。

因此eof必须通过lexeme运行。

fields = many (try field) <* lexeme eof

否则 Parsec 会尝试在换行符上运行 fields 解析器。

关于haskell - 当我的解析器显式查找时,为什么会得到 "unexpected end of input"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376163/

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