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

Ana*_*Ana 1 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]
Run Code Online (Sandbox Code Playgroud)

我不禁感到有一种更简单的方法可以做到这一点.有人可以开导我吗?

Ste*_*ehl 7

老实说,最简单的方法就是将其解析为自然数,然后如果通过返回mzero超出界限0-255则无法解析.

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
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要在012失败?你能检查一下第一个数字是不是零吗? (2认同)