Re:Parser combinator library in C
by drostie on Tuesday August 07, 2012 @08:07AM
(#4349657)
It's not bad, but the "0x" is part of the conversion into an integer, not part of the parsed address. That is, the more-complicated-looking combinator converts the string "03-c0" to `Address 3 192`, while it looks like yours converts the string "0x03-0xc0" to to `Address "0x03" "0xc0"`. (I'm not totally sure about that; I'm still very new to Haskell. Thanks for the heads-up on attoparsec though.)
[ Parent
| on HN ]
The (* >) operator [1] (the space in the middle is just to circumvent HN's rather dumb comment formatting) sequences its two arguments, ignoring the one on the left. So
string "0x" *> takeWhile1 hexadecimal
parses a literal string "0x", then one or more hexadecimal digits, and the result is just the hexadecimal digits.[1] http://hackage.haskell.org/packages/archive/base/latest/doc/...
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import qualified Data.Attoparsec.Text as P
import qualified Data.Text as T
data Address = Address {start :: Int, end :: Int} deriving Show
address = Address <$> hexDigits <*> (dash *> hexDigits)
where
hexDigits = P.string "0x" *> P.hexadecimal
dash = P.char '-'
parse parser str = P.feed (P.parse parser $ T.pack str) T.empty
Put the above into a file like 'parse.hs'. ~> ghci parse.hs
*Main> parse address "0x1-0x1"
Done "" Address {start = 1, end = 1}
You might need to install attoparsec beforehand: cabal install attoparsec