2012-01-03 3 views
1

Есть ли способ сделать правильный футляр с футляром Parsec (скажем, мне нужен парсер, который ведет себя как stringCI от Data.Attoparsec.Text). Код, который делает регистр без учета регистра в Text.Parsec.Token, просто использует char (toLower c) <|> char (toUpper c), но не имеет правильного футляра. Поэтому я озадачен, возможно ли это вообще.Как правильно складывать футляр с помощью Parsec

+0

Для немых среди нас, можете ли вы сказать, что не так с 'char (toLower c) <|> char (toUpper c)'? –

+0

Я бы не сказал, что это неправильно, это просто отличается от фальцовки. Следующее свойство не содержит 'prop_foo s = length s == (length. FoldCase) s'. Скажем, сложение флага может изменить длину строки. – user1078763

ответ

1

У Parsec нет никакой функции для этого встроенного устройства, но вы можете реализовать его, например. foldCase от case-insensitive пакета и satisfy в петле. Я не эксперт по Юникоду, поэтому я не уверен, какие дополнительные меры предосторожности вы должны предпринять, чтобы обеспечить правильность.

Пакет text-icu рекомендуется в документации по foldCase, если вам требуются языковые преобразования; это кажется довольно всеобъемлющим.

+0

Я до сих пор не вижу простого способа сделать это. 'satisf' работает по одному символу за раз, а' foldCase' работает над последовательностью символов. Конечно, я мог бы разложить аргумент на свой парсер (позволяет называть его 'stringCI', например, он вызван в attoparsec), но как бы я мог преобразовать (сбросить регистр) входной поток? – user1078763

+0

@ user1078763: Хм, я полагаю, это не так просто, потому что это не преобразование по каждому символу ... Если ваша строка имеет известный конец (например, пробел), вы можете прочитать до этой конечной точки, а затем проверить ее для правильности. Кроме того, вы можете попробовать случайные складывающиеся одноэлементные строки, состоящие из каждого символа 'satisf' дает вам; это не получилось бы для контекстно-зависимых складков, хотя, как греческая сигма. – ehird

+0

Я имею в виду, что есть одно уродливое решение, которое я могу себе представить. Повторяю «try anyChar», и случай складывает все, что вы получили до сих пор, пока оно не будет (a) соответствует аргументу сложенного аргумента для 'stringCI' или (b) длиннее, чем случай сложенный аргумент 'stringCI'. Затем преуспеть на (a) и выйти из строя (b). – user1078763

Смежные вопросы