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

Reply via email to