WURFL-0.1: src/WURFLParser.hs
module WURFLParser (
parseTree
, ParseError
) where
import Text.ParserCombinators.Parsec.Prim
import Text.ParserCombinators.Parsec.Error
import Data.Either
import Text.ParserCombinators.Parsec.Char
import Text.ParserCombinators.Parsec.Combinator
import WURFLTypes
userAgentEnd :: MD -> Parser MD
userAgentEnd r = do
manyTill anyToken eof
return r
treeParser :: MD -> Tree MD -> Parser MD
treeParser o (Node a Nothing children) = do { string a
; r <- choice . reverse $ userAgentEnd o : map (treeParser o) children
; return r
}
treeParser _ (Node a (Just v) []) = try $ do { string a
; return v
}
treeParser _ (Node a (Just v) children) = try $ do { string a
; r <- choice . reverse $ userAgentEnd v : map (treeParser v) children
; return r
}
parseTree :: [Tree MD] -> String -> Either ParseError MD
parseTree tree useragent = parse (choice (map (treeParser emptyMD) tree)) "" useragent