Ошибка синтаксического анализа символа (――) в Haskell - PullRequest
0 голосов
/ 06 мая 2018

Я пишу парсер для разбора огромных кусков английского текста с помощью attoparsec. Пока все было замечательно, за исключением разбора этого символа "――". Я знаю, что это всего 2 черты вместе "--". Странная вещь, парсер ловит это в этом коде:

wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass "――?!,:")) >> pure () 

но не в этом случае:

specialChars = ['――', '?', '!', ',', ':']
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass specialChars)) >> pure ()

Причина, по которой я использую список specialChars, заключается в том, что у меня много символов для рассмотрения, и я применяю его несколько раз. А что касается входных данных, рассмотрим: "I am ――Walt Whitman._", а выход должен быть {"I", "am", "Walt", "Whiteman."} Я полагаю, что это в основном потому, что "――" не является Char? Как это исправить?

1 Ответ

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

A Char - это один символ, полная остановка. ―― - это два символа, поэтому это два Char с. Вы можете вписать в String столько Char, сколько хотите, но вы точно не можете вписать два Char в один Char.

Поскольку satisfy учитывает отдельные символы за раз, вероятно, это не то, что вам нужно, если вам нужно проанализировать последовательность из двух символов как одну единицу. Функция inClass просто создает предикат для символов (inClass, частично примененный к одному аргументу, создает функцию типа Char -> Bool), поэтому inClass "――" совпадает с inClass ['―', '―'], что точно так же, как inClass ['―'] поскольку дубликаты не имеют значения. Это тебе не сильно поможет.

Попробуйте использовать string вместо или в сочетании с inClass, поскольку он предназначен для обработки последовательностей символов. Например, что-то вроде этого может лучше соответствовать вашим потребностям:

wordSeparator :: Parser ()
wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure ()
...