私は attoparsec パーサーを書いて、測定単位の統一コードが a と呼ぶものを解析するのに行き詰まってい<ATOM-SYMBOL>
ます。これは、数字で終わらない特定のクラス (そのクラスには 0 ~ 9 のすべての数字が含まれる) の最長の文字シーケンスであると定義されています。
したがって、何も消費せずに失敗したいので、消費しfoo27
て返したい入力があるとします。foo
237bar26
237bar
19
takeWhile1
or takeTill
orからこれを構築する方法がわかりません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|~"
それを変更して、最後の文字がすべて数字ではなく数字であるかどうかをテストしようとしましたが、一度に1文字ずつバックトラックするようには見えません。
更新 2:
ファイル全体はhttps://github.com/dmcclean/Dimension-attoparsec/blob/master/src/Numeric/Units/Dimensional/Parsing/Attoparsec.hsにあります。これは、 https://github.com/dmcclean/Dimensionprefixes
からのブランチに対してのみビルドされます。