2013-09-23 2 views
5

Не уверен, что это возможно (или рекомендуется), но я по существу пытаюсь найти последовательность символов в файле с помощью 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.

Возможно, это был неправильный способ сделать это, и я хотел бы узнать, как это сделать, и я хотел бы узнать путь .

ответ

1

Если не для парсера parens, это было бы хорошо для регулярного анализатора языка, например, regex-applicative. Это объясняется тем, что регулярные синтаксические анализаторы языка гораздо более «умны» в отношении «обратного отслеживания» (на самом деле никакого возврата не происходит вообще, и все же изучается каждая возможная ветвь).

Однако, как вы, вероятно, знаете, совпадающие скобки не являются обычным языком. Если вы можете расслабить свою грамматику, чтобы стать регулярной, попробуйте применить регулярное выражение.

Смежные вопросы