私はこれを行うにしてみてください。Parsec-Parserは問題なく動作しますが、それは改善されますか?
一部のテキスト#{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 "Some Text#{0,0,0} some Text#{0,0,0}#{0,0,0} more Text#{0 、0,0} "
しかし、私はそれがいいとは思いません。
1)私の問題ではlookAhead
の使用が本当に必要ですか?
2)return (Inside "")
は醜いハックですか?
3)同じことを実現するために、一般的にはより簡潔でスマートな方法がありますか?
ありがとうございます。あなたのバージョンは残念なことに、最初は "テキスト"の醜いハックにつながったエラーを生成します。文字列 "some"でも失敗します。これは、 "eof" -checkを "text" -parserに入れ、空のInside "を入力するために強制したものです。 – Secoe
@Sec Oeごめんなさい!私は、 '試してみると' eof'それ自体を扱うと思っていました。 – Anthony