3

私は attoparsec パーサーを書いて、測定単位の統一コードが a と呼ぶものを解析するのに行き詰まってい<ATOM-SYMBOL>ます。これは、数字で終わらない特定のクラス (そのクラスには 0 ~ 9 のすべての数字が含まれる) の最長の文字シーケンスであると定義されています。

したがって、何も消費せずに失敗したいので、消費しfoo27て返したい入力があるとします。foo237bar26237bar19

takeWhile1or takeTillorからこれを構築する方法がわかりません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からのブランチに対してのみビルドされます。

4

1 に答える 1