Вы на правильном пути! Вы написали парсер (prose
), который читает одно слово: many' letter
распознает последовательность букв.
Итак, теперь, когда вы выяснили, как разбирать одно слово, ваша задача - увеличить его, чтобы разобрать последовательность слов, разделенных пробелами. Вот что sepBy
делает: p `sepBy` q
многократно запускает парсер p
с разбросанным парсером q
.
Итак, парсер последовательности слов выглядит примерно так (я позволил себе переименовать ваш prose
в word
):
word = many letter
phrase = word `sepBy` some space -- "some" runs a parser one-or-more times
ghci> parseOnly phrase "wibble wobble wubble" -- with -XOverloadedStrings
Right ["wibble","wobble","wubble"]
Теперь, phrase
, составленный из letter
и space
, умрет от непробельных непробельных символов, таких как '
и .
. Я оставлю это вам, чтобы выяснить, как это исправить. (Как подсказка, вам, вероятно, потребуется изменить many letter
на many (letter <|> ...)
, в зависимости от того, как именно вы хотите, чтобы он вел себя на различных знаках препинания.)