【发布时间】:2015-12-04 05:53:52
【问题描述】:
我一直在编写一个 attoparsec 解析器来解析 Uniform Code for Units 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。这仅针对来自https://github.com/dmcclean/dimensional 的prefixes 分支构建。
【问题讨论】:
-
这是一个可能对您有所帮助的组合器:
notFollowedBy p = p >> fail "not followed by" -
请让您的问题自成一体并添加您的导入语句。在这里,有人想知道(尽管有人可能会猜到)合格的导入
A、P和T对应于什么。 -
你能拿走整个令牌,把它倒过来,丢掉数字,倒回去看看有没有剩下的吗?
标签: haskell negative-lookahead attoparsec