私はこれをしようとします:
次の形式でテキストを解析します。
一部のテキスト #{0,0,0} 一部のテキスト #{0,0,0}#{0,0,0} その他のテキスト #{0,0,0}
いくつかのデータ構造のリストに:
[内側 "一部のテキスト",外側 (0,0,0),内側 "一部のテキスト",外側 (0,0,0),外側 (0,0,0),内側 "その他のテキスト",外側 (0, 0,0)]
したがって、これらの #{a,b,c} ビットは、残りのテキストとは異なるものに変わるはずです。
私はこのコードを持っています:
module ParsecTest where
import Text.ParserCombinators.Parsec
import Monad
type Reference = (Int, Int, Int)
data Transc = Inside String | Outside Reference
deriving (Show)
text :: Parser Transc
text = do
x <- manyTill anyChar ((lookAhead reference) <|> (eof >> return (Inside "")));
return (Inside x)
transc = reference <|> text
alot :: Parser [Transc]
alot = do
manyTill transc eof
reference :: Parser Transc
reference = try (do{ char '#';
char '{';
a <- number;
char ',';
b <- number;
char ',';
c <- number;
char '}';
return (Outside (a,b,c)) })
number :: Parser Int
number = do{ x <- many1 digit;
return (read x) }
これは期待どおりに機能します。次のように入力して、ghci でこれをテストできます。
parseTest alot "一部のテキスト #{0,0,0} 一部のテキスト #{0,0,0}#{0,0,0} その他のテキスト #{0,0,0}"
でも、もったいないと思います。
1) の使用はlookAhead
本当に私の問題に必要ですか?
2)return (Inside "")
醜いハックですか?
3)一般的に、同じものをアーカイブするためのより簡潔でスマートな方法はありますか?