Я застрял, написав парсер attoparsec, чтобы разобрать, что Uniform Code for Units of Measure вызывает <ATOM-SYMBOL>
. Он определяется как самая длинная последовательность символов в определенном классе (этот класс включает в себя все цифры 0-9), который не заканчивается цифрой.Имена парсеров, которые не заканчиваются на определенные символы в attoparsec
Поэтому, учитывая вход foo27
Я хочу, чтобы потреблять и вернуть foo
для 237bar26
Я хочу, чтобы потреблять и вернуть 237bar
для 19
Я хочу потерпеть неудачу, не потребляя ничего.
Я не могу понять, как это сделать из takeWhile1
или takeTill
или scan
, но я, вероятно, отсутствует что-то очевидное.
Update: Моя лучшая попытка до сих пор было то, что мне удалось исключить последовательности, которые полностью цифры
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|~"
Я попытался изменить что проверить, если последний символ был цифра вместо если бы все они были, но он, похоже, не возвращает назад одного персонажа за раз.
Update 2:
Весь файл в https://github.com/dmcclean/dimensional-attoparsec/blob/master/src/Numeric/Units/Dimensional/Parsing/Attoparsec.hs. Это связано только с веткой prefixes
от https://github.com/dmcclean/dimensional.
Вот комбинатор, который может помочь вам: 'notFollowedBy р = р >> обанкротиться«не следует»' – arrowd
Пожалуйста, ваш вопрос самодостаточным и добавить свои операторы импорта. Здесь остается удивляться (хотя можно догадаться), что соответствуют соответствующим импортам 'A',' P' и 'T'. – Jubobs
Не могли бы вы взять весь токен, отменить его, сбросить цифры, вернуться назад и проверить, осталось ли что-нибудь? – VlatkoB