In fact, I use NanoParsec and now it is flexible enough to parse things 
like "apdu #x3F #xbE #xEf", I include the whole source, hope it helps

import froid.util.Log
import frege.data.Char hiding (isNumber)
import frege.data.NanoParsec
import Control.Concurrent as C
import io.github.mchav.tryfrege.Utilities

data Command = Apdu [Byte]
             | Reset
             | Finish
             | Exception

derive Show Command

hexdigit    = satisfy (Char.isHexDigit   :: Char -> Bool)

h1 :: Parser [] Char [Char]
h1 = do
  a <- expect '#'
  b <- expect 'x'
  c <- hexdigit
  d <- hexdigit
  return $ [c, d]

h2 :: Parser [] Char [[Char]]
h2 = do
  spaces *> h1 `sepBy` spaces

h3 :: Parser [] Char [[Char]]
h3 = do
  a <- spaces *> some letter <* spaces
  b <- h2
  return $ a:b

h4 :: Parser [] Char [[Char]]
h4 = do
  spaces *> h3 <* spaces

parseDriver :: Parser [] Char [[Char]] -> ([] Char) -> IO [[Char]]
parseDriver p s = case runid p s of
    (Left msg, str) -> do
      error $ "Parse failed!" ++ (reporterror str msg)

    (Right r, str) -> do
        if (null str) then return r
          else error $ "Parse failed: " ++ (reporterror str "Tokens left")

digitToByte = intToByte . digitToInt

parseJobs input = do
  r <- parseDriver h4 (unpacked input)
  case r of
    ['a','p','d','u']:d -> return $ Apdu $ map (\[a,b]-> (digitToByte a) * 
16 + digitToByte b) d
    [['r','e','s','e','t']] -> return Reset
    [['f','i','n','i','s','h']] -> return Finish
    [['e','x','c','e','p','t','i','o','n']] -> return Exception
    _ -> return Exception


在 2018年1月28日星期日 UTC+8上午4:47:17,Marimuthu Madasamy写道:
>
> As a workaround, you can, of course, use the native implementation:
>
>
> pure native parseByte java.lang.Byte.parseByte :: String -> 
> (NumberFormatException | Byte)
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Frege Programming Language" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to frege-programming-language+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to