Brief:
I want to make the parser 
    choice [string "dummy", anystring ]
        where anystring = many get

return the first match. 
(Thus if "dummy" matches disregarg all following
parsers)
..)

details:

I want to parse some wmii events.
They all look this way
ClientFocus 2
ClientFocus 2
LeftBarClick 1 web

At this moment I only need two of them (FocusTag and UnfocusTag)
So I've created the data type

type O = String
data WMIIEvent = FocusTag Int
                | UnfocusTag Int
                | Unkown String -- to be implemented

Now I want to create a simple ReadP parser which looks like this:

============= parser code ============================================
instance Read WmiiEvent where
  readsPrec _ = readP_to_S (foldr1 takeFirst
                [ rp "FocusTag" FocusTag
                , rp "UnfocusTag" UnfocusTag
                , rpUnkown ])
    where rp str f = fmap f $ string str >> skipSpaces >> liftM read (many get)
          rp :: (Read a) => String -> (a -> WmiiEvent) -> ReadP WmiiEvent
          rpUnkown = (many get) >>= return . Unkown
          rpUnkown :: ReadP WmiiEvent

But I'm getting an ambiguous parse. (because "UnfocusTag 3" makes two
parsers of the choice list succeed.

How is this done?
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to