gpt4 book ai didi

parsing - 用 Haskell 编写的解析器无法按预期工作

转载 作者:行者123 更新时间:2023-12-04 11:49:50 28 4
gpt4 key购买 nike

我在玩 Haskell 的 parsec图书馆。我试图解析 "#x[0-9A-Fa-f]*" 形式的十六进制字符串成整数。这是我认为可行的代码:

module Main where

import Control.Monad
import Numeric
import System.Environment
import Text.ParserCombinators.Parsec hiding (spaces)

parseHex :: Parser Integer
parseHex = do
string "#x"
x <- many1 hexDigit
return (fst (head (readHex x)))

testHex :: String -> String
testHex input = case parse parseHex "lisp" input of
Left err -> "Does not match " ++ show err
Right val -> "Matched" ++ show val

main :: IO ()
main = do
args <- getArgs
putStrLn (testHex (head args))
然后我尝试测试 testHex Haskell 的 repl 中的函数:
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main ( src/Main.hs, interpreted )
Ok, one module loaded.
*Main> testHex "#xcafebeef"
"Matched3405692655"
*Main> testHex "#xnothx"
"Does not match \"lisp\" (line 1, column 3):\nunexpected \"n\"\nexpecting hexadecimal digit"
*Main> testHex "#xcafexbeef"
"Matched51966"
第一次和第二次尝试按预期工作。但在第三个中,字符串匹配到无效字符。我不希望解析器执行此操作,但如果字符串中的任何数字不是有效字符串,则不匹配。为什么会发生这种情况,如果解决这个问题怎么办?
谢谢!

最佳答案

您需要放置 eof 在最后。

parseHex :: Parser Integer
parseHex = do
string "#x"
x <- many1 hexDigit
eof
return (fst (head (readHex x)))
或者,您可以使用 eof 组合它如果你想重用它,你在哪里使用它 parseHex在其他地方。
testHex :: String -> String
testHex input = case parse (parseHex <* eof) "lisp" input of
Left err -> "Does not match " ++ show err
Right val -> "Matched" ++ show val

关于parsing - 用 Haskell 编写的解析器无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69378170/

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