I could not resist this. The code
import Text.ParserCombinators.UU.Parsing
pCommand [] = pure []
pCommand xxs@(x:xs) = ((:) <$> pSym x <*> pCommand xs) `opt` xxs
pCommands = amb . foldr (<|>) pFail . map pCommand $ ["banana",
"chocolate", "frito", "fromage"]
t :: String -> ([String], [Error Char Char Int])
t input = parse ( (,) <$> pCommands <*> pEnd) (listToStr input)
gives the following results:
*Main> t ""
(["banana","chocolate","frito","fromage"],[])
*Main> t "b"
(["banana"],[])
*Main> t "fr"
(["frito","fromage"],[])
*Main> t "x"
(["banana","chocolate","frito","fromage"],[
The token 'x'was not consumed by the parsing process.])
*Main> t "frox"
(["fromage"],[
The token 'x'was not consumed by the parsing process.])
*Main> t "frx"
(["frito","fromage"],[
The token 'x'was not consumed by the parsing process.])
*Main>
I think it is less clumsy and far less confusing than the Parsec code.
Note that the function amb tells that its parameter parser can be
ambiguous
Doaitse
On 13 okt 2009, at 17:10, Uwe Hollerbach wrote:
On 10/12/09, Martijn van Steenbergen <[email protected]>
wrote:
Brandon S. Allbery KF8NH wrote:
My fix would be to have myPrefixOf require the prefix be
terminated in
whatever way is appropriate (end of input, white space, operator?)
instead of simply accepting as soon as it gets a prefix match
regardless
of what follows.
Maybe you can use notFollowedBy for this.
HTH,
Martijn.
Yes, I've looked at that and am thinking about it. I'm not quite
certain it's needed in my real program... I seem to have convinced
myself that if I actually specify a proper set of unique prefixes, ie,
set the required lengths for both "frito" and "fromage" to 3 in the
test program, I won't get into this situation. Assuming I haven't
committed another brain-fart there, that would be sufficient;
presumably, in a real program one would want to actually specify the
unique prefix, rather than a non-unique pre-prefix. It seems to work
fine in my real program, anyway.
Uwe
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe