parsing - 有没有更简单的方法来为 8 位十进制整数编写这个 Haskell Parsec 解析器?

标签 parsing haskell parsec

我编写了以下 Parsec 代码来解码表示 Word8(无符号 8 位整数)的文本:

decOctetP = try e <|> try d <|> try c <|> try b <|> a
    where
        a = fmap (:[]) digit
        b = do
            m <- oneOf "123456789"
            n <- digit
            return [m, n]
        c = do
            char '1'
            m <- count 2 digit
            return ('1':m)
        d = do
            char '2'
            m <- oneOf "01234"
            n <- digit
            return ['2', m, n]
        e = do
            string "25"
            m <- oneOf "012345"
            return ['2', '5', m]

我忍不住觉得有一种更简单的方法可以做到这一点。谁能赐教一下?

最佳答案

老实说,最简单的方法就是将其解析为自然数,然后如果它超出范围 0-255 则返回 mzero 以失败解析。

import Control.Monad

import Text.Parsec
import Text.Parsec.String (Parser)
import qualified Text.Parsec.Token as Tok

natural :: Parser Integer
natural = Tok.natural lexer

number :: Parser Integer
number = do
  n <- natural
  if n < 256 then return n
  else mzero

关于parsing - 有没有更简单的方法来为 8 位十进制整数编写这个 Haskell Parsec 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773785/

相关文章:

java - 我需要解析格式不正确的 xml 数据 (HTML)

function - 错误 - 推断类型不够通用

scala - 构造函数应用程序列表

haskell - 为什么 foldr' 不如 foldl' 严格?

haskell - 的 是什么意思? Haskell 中的记录语法如何做?

parsing - 用秒差距解析子字符串(通过忽略不匹配的前缀)

java - IPv6 验证

c - 开源 ANSI C99 解析器?

在 Haskell 中解析和 pretty-print 相同的文件格式

javascript - 在 JS 中解析 JSON 字符串中的特殊字符