Парсинг строк с уцелевшими персонажами, используя парсек


Я работаю через упражнения в записи себя схема в течение 48 часов/парсинг и набросал что-то сделать parseString понять экранированные символы. Также имел некоторое вдохновение из реального мира Хаскелл Глава 16 минус аппликативных деталей.

parseString :: Parser LispVal
parseString = do char '"'
                 x <- many $ chars
                 char '"'
                 return $ String x
    where chars = escaped <|> noneOf "\""
          escaped = choice $ map tryEscaped escapedChars
          tryEscaped c = try $ char '\\' >> char (fst c) >> return (snd c)
          escapedChars = zip "bnfrt\\\"/" "\b\n\f\r\t\\\"/"

Это работает, но я не люблю мой 'tryEscaped' определение. Какие альтернативы?



4187
14
задан 14 мая 2011 в 01:05 Источник Поделиться
Комментарии
1 ответ

Некоторые предложения:


  • Заменить КСТ и СНД с узором матч или явных аргументов функции.

  • Экстракт общим символом '\\' парсер. Вы можете избежать попробуйте.

  • Струны с большим количеством сбежавших персонажей трудно читать и трудно визуально
    убедитесь, что управляющие коды были правильно сопоставлены с их замены. Рассмотрим
    правописание их и выравнивая их, чтобы сделать это легко увидеть.

Вот что я придумал:

escaped = char '\\' >> choice (zipWith escapedChar codes replacements)
escapedChar code replacement = char code >> return replacement
codes = ['b', 'n', 'f', 'r', 't', '\\', '\"', '/']
replacements = ['\b', '\n', '\f', '\r', '\t', '\\', '\"', '/']

10
ответ дан 23 мая 2011 в 06:05 Источник Поделиться