Как часть попытки написать JSON Parser, я работаю над разбором значения JSON String.Написание парсера для строки JSON
Учитывая следующее определение из Haskell профессора Брента Йорги в course:
-- A parser for a value of type a is a function which takes a String
-- represnting the input to be parsed, and succeeds or fails; if it
-- succeeds, it returns the parsed value along with the remainder of
-- the input.
newtype Parser a = Parser { runParser :: String -> Maybe (a, String) }
Я бегу в проблему, поскольку, как я понимаю, мой второй анализатор, zeroOrMore notEndOfString
, просто потребляет каждый маркер до достижения конец строки.
data JValue = S String | ...
parseStringJValue :: Parser JValue
parseStringJValue = S <$> ((char '"') *> (zeroOrMore notEndOfString) <* (char '"'))
notEndOfString :: Parser Char
notEndOfString = Parser f
where
f [] = Nothing
f (x:xs) = Just (x, xs)
Используя этот подход аппликативного, пожалуйста, дайте мне намек в сторону изменения мой выше parseStringJValue
на самом деле работает.
Примечание. У меня есть слабое представление о том, как его решить с помощью Monads, но я не уверен, если они требуются.
Подсказка: строка в 'notEndOfString' является результатом вашего синтаксического анализа, а не вводом для анализа. – genisage
Работает ли код? –
Вы, вероятно, хотите 'zeroOrMore notEndOfStringOrQuote'. Например, в parsec я бы просто написал 'many (noneOf" \ "") '. – user2407038