Улучшения в парсере Haskell JSON - PullRequest
0 голосов
/ 07 мая 2018

Для одного из моих курсов в прошлом семестре нам было поручено реализовать анализатор JSON, который выплевывает форматированный HTML.Я закончил тем, что реализовал это, что я чувствовал, было больше итеративным способом, чем функциональным.Вот основной фрагмент кода, с которым у меня возникли проблемы:

stringToTokens (x:xs)
            .....
            | x == '\"' = StringLiteral (parseStringToken xs) : stringToTokens (advancePastString xs)
            | startsNumeric x = Numeric (processNumeric (x:xs) takeWhile) : stringToTokens (processNumeric xs dropWhile)
            | startsKeyword x = Keyword (processKeyword (x:xs) take) : stringToTokens (processKeyword (x:xs) drop)
            .....
            | otherwise = stringToTokens xs

....
advancePastString :: String -> String
advancePastString (x:xs)
            | x == '\"' = xs
            | x == '\\' = advancePastString (tail xs)
            | otherwise = advancePastString xs

Моя проблема с тем, как я справился с этим, заключается в том, что мне кажется, что я понял, как реализовать это на процедурном языке, и просто заменилцикл с функциями рекурсии и отбрасывания.Хотя это работает, мне интересно, что было бы более идиоматичным функциональным способом решения этой проблемы.

1 Ответ

0 голосов
/ 10 мая 2018

Я бы попробовал комбинатор парсера. Это хорошее место для начала: Напишу вам Haskell: Парсинг Стивена Дила . Это простой пример того, как выглядит комбинатор парсера. Тогда я бы посмотрел на доступные комбинаторы парсера, такие как parsec, attoparsec и trifecta. Мне лично нравится attoparsec, но trifecta имеет гораздо больше возможностей.

Я также написал небольшое руководство по attoparsec. Он не завершен, но должен помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...