我一直在编写一个 attoparsec 解析器来解析度量单位的统一代码所称的<ATOM-SYMBOL>
. 它被定义为某个类(该类包括所有数字 0-9)中不以数字结尾的最长字符序列。
所以给定我想要消费和返回的输入foo27
,foo
因为237bar26
我想要消费和返回237bar
,因为19
我想失败而不消费任何东西。
我不知道如何用takeWhile1
or来构建它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。这仅针对来自https://github.com/dmcclean/Dimensionprefixes
的分支构建。