Не уверен, что это возможно (или рекомендуется), но я по существу пытаюсь найти последовательность символов в файле с помощью Parsec. Пример файла:Поиск шаблона с помощью 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
, и если это не работает, ест один символ и повторите попытку. Я мог разобрать все мусор в середине (я знаю, что это может быть), но мне все равно, что это такое (так зачем его разбирать), и это потенциально сложно.
Проблема в том, что мое решение не совсем работает. anyChar
в конечном итоге поглощает все, и поиск END
никогда не получает шанс. Кроме того, где-то в careAbout
мы ударили eof
, и из-за него выбрано Exception
.
Возможно, это был неправильный способ сделать это, и я хотел бы узнать, как это сделать, и я хотел бы узнать путь .