これが可能かどうか (または推奨されるかどうか) はわかりませんが、基本的に、Parsec を使用してファイル内の一連の文字を検索しようとしています。サンプルファイル:
START (name)
junk
morejunk=junk;
dontcare
foo ()
bar
care_about this (stuff in here i dont care about);
don't care about this
or this
foo = bar;
also_care
about_this
(dont care whats in here);
and_this too(only the names
at the front
do i care about
);
foobar
may hit something = perhaps maybe (like this);
foobar
END
そして、これを機能させるための私の試みは次のとおりです。
careAbout :: Parser (String, String)
careAbout = do
name1 <- many1 (noneOf " \n\r")
skipMany space
name2 <- many1 (noneOf " (\r\n")
skipMany space
skipMany1 parens
skipMany space
char ';'
return (name1, name2)
parens :: Parser ()
parens = do
char '('
many (parens <|> skipMany1 (noneOf "()"))
char ')'
return ()
parseFile = do
manyTill (do
try careAbout <|>
anyChar >> return ("", "")) (try $ string "END")
を探して力ずくで検索しようとしていますがcareAbout
、それがうまくいかない場合は、1文字食べてもう一度やり直してください。途中のすべてのがらくたを解析できますが (それが何であるかはわかっています)、それが何であるかは気にしません (だからわざわざ解析する必要があるのはなぜですか)。複雑になる可能性があります。
問題は、私の解決策がうまくいかないことです。anyChar
すべてを消費することになり、検索にEND
はチャンスがありません。また、どこかでcareAbout
打っeof
たりException
、それが原因で投げたりすることもあります。
これはおそらくそれを行う正確な方法ではありません。私はそれを行う方法、またはさらに良い方法、Right Way™を知りたいと思っています。