Я застрял в написании синтаксического анализатора attoparsec для анализа Единого кода для единиц измерения. of Measure вызывает <ATOM-SYMBOL>
. Он определяется как самая длинная последовательность символов определенного класса (этот класс включает все цифры от 0 до 9), которая не заканчивается цифрой.
Итак, учитывая ввод foo27
, я хочу потреблять и возвращать foo
, для 237bar26
я хочу потреблять и возвращать 237bar
, для 19
я хочу потерпеть неудачу, ничего не потребляя.
Я не могу понять, как построить это из takeWhile1
, takeTill
или scan
, но я, вероятно, упускаю что-то очевидное.
Обновление: моя лучшая попытка до сих пор состояла в том, что мне удалось исключить последовательности, которые полностью состоят из цифр.
atomSymbol :: Parser Text
atomSymbol = do
r <- core
if (P.all (inClass "0-9") . T.unpack $ r)
then fail "Expected an atom symbol but all characters were digits."
else return r
where
core = A.takeWhile1 $ inClass "!#-'*,0-<>-Z\\^-z|~"
Я попытался изменить это, чтобы проверить, был ли последний символ цифрой, а не все ли они были, но, похоже, он не отслеживает один символ за раз.
Обновление 2:
Весь файл находится по адресу https://github.com/dmcclean/Dimensional-attoparsec/blob/master/src/Numeric/Units/Dimensional/Parsing/Attoparsec.hs. Это строится только против ветки prefixes
из https://github.com/dmcclean/Dimension.
notFollowedBy p = p >> fail "not followed by"
- person arrowd   schedule 04.12.2015A
,P
иT
. - person jub0bs   schedule 05.12.2015