2013-09-23 10 views
5

Nicht sicher, ob dies möglich ist (oder empfohlen), aber ich versuche im Wesentlichen mit Parsec nach einer Zeichenfolge in der Datei zu suchen. Beispieldatei:Suche nach einem Muster mit 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 

Und hier ist mein Versuch, es immer Arbeit:

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") 

Ich versuche, durch die Suche nach careAbout die Suche zwingen Brute, und wenn das nicht funktioniert, essen ein Zeichen und versuche es erneut. Ich könnte den ganzen Kram in der Mitte analysieren (ich weiß, was es sein könnte), aber ich interessiere mich nicht dafür, was es ist (also warum sollte ich es analysieren), und es ist möglicherweise kompliziert.

Problem ist, meine Lösung funktioniert nicht ganz. anyChar endet alles verbraucht, und die Suche nach END bekommt nie eine Chance. Auch irgendwo in der careAbout schlagen wir eof und einige Exception wird wegen ihm geworfen.

Dies ist wahrscheinlich die genaue falsche Art und Weise, es zu tun, und ich würde gerne von eine Weg oder noch besser, der Right Way ™, es zu tun wissen.

Antwort

1

Wenn nicht für den Parser parens, wäre dies eine gute Lösung für einen regulären Sprachparser wie regex-applicative. Dies liegt daran, dass reguläre Sprachparser viel "schlauer" sind, wenn es um "Backtracking" geht (tatsächlich gibt es überhaupt kein Backtracking und dennoch wird jeder mögliche Zweig erforscht).

Wie Sie wahrscheinlich wissen, sind passende Klammern keine reguläre Sprache. Wenn Sie Ihre Grammatik entspannen können, um regulär zu werden, versuchen Sie es mit Regex-Anwendung.

Verwandte Themen