Я следую this tutorial для реализации Комбиниров Parser (a la parsec) в Haskell. Я реализовал все, что упоминалось в NanoParsec.Реализация try (look-ahead) и доStop с комбинаторными компиляторами
За несколько часов в настоящее время, я struggeling реализовать
-- try p. If p fails continue without consuming anything
try :: Parser a -> Parser a
try p = ...
-- Parser for everything, until the character-sequence stop appears.
-- If stop does not appear at all: fail
untilStop :: String -> Parser String
untilStop stop = ...
Моя лучшая попытка реализовать untilStop
выглядит несколько, как это и не совсем работа
untilStop :: String -> Parser String
untilStop (c : cs) = do
s <- some $ satisfy (/= d)
string (c : cs) <|> do
i <- item
untilStop (d : ds)
-- maybe use msum from MonadPlus to combine?
Я не мог понять, как объединить s
, i
и рекурсивный звонок без сбоев из-за string
не все вместе.
Я думаю, что у меня есть try
, untilStop
должно быть простым. Может ли кто-нибудь указать мне в правильном направлении или реализовать его (try
) для меня?
Сейчас я все еще изучаю Монады, Применительные и связанные с ними вещи, поэтому попытка понять исходный код парсека была невозможна для меня.
Вам не нужно 'try' для этой простой библиотеки парсеров. 'p <|> q' уже ведет себя как' try p <|> q'. Я прав? – Euge
Well '<|> :: Parser a -> Parser a -> Parser a' нуждается в альтернативе моей * проверенной * опции. Я надеялся на что-то, что я могу просто «попробовать», и если он терпит неудачу, ничего не делайте и просто переходите к следующему утверждению в моей записи «do». – elfeck
Именно так работает '<|>''. – Euge