2011-12-06 5 views
6

Próbuję parsować komentarze w stylu lisp z języka s-expression za pomocą FParsec. Mam trochę pomocy z analizowaniem komentarzy jednoliniowych w poprzednim wątku - How to convert an FParsec parser to parse whitespaceJak analizować komentarze za pomocą FParsec

Podczas gdy to zostało rozwiązane, nadal muszę analizować komentarze wielowierszowe. Oto aktualny kod -

/// Read whitespace character as a string. 
let spaceAsStr = anyOf whitespaceChars |>> fun chr -> string chr 

/// Read a line comment. 
let lineComment = pchar lineCommentChar >>. restOfLine true 

/// Read a multiline comment. 
/// TODO: make multiline comments nest. 
let multilineComment = 
    between 
     (pstring openMultilineCommentStr) 
     (pstring closeMultilineCommentStr) 
     (charsTillString closeMultilineCommentStr true System.Int32.MaxValue) 

/// Read whitespace text. 
let whitespace = 
    lineComment <|> 
    multilineComment <|> 
    spaceAsStr 

/// Skip any white space characters. 
let skipWhitespace = skipMany whitespace 

/// Skip at least one white space character. 
let skipWhitespace1 = skipMany1 whitespace 

Niestety, analiza multiliniiComment nigdy się nie powiedzie. Ponieważ jest to kombinator, nie mogę podać punktów przerwania ani przeanalizować, dlaczego nie zadziała.

Jakieś pomysły, dlaczego to nie zadziała?

Odpowiedz

4

Spróbuj zmienić argument bool dla closeMultilineCommentStr do fałszywego

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue) 

W przeciwnym razie będzie to przeskoczyć ciąg closeMultilineCommentStr.

Aby pracować z zagnieżdżonych komentarzy

let rec multilineComment o= 
    let ign x = charsTillString x false System.Int32.MaxValue 
    between 
     (pstring openMultilineCommentStr) 
     (pstring closeMultilineCommentStr) 
     (attempt (ign openMultilineCommentStr >>. multilineComment >>. ign closeMultilineCommentStr) <|> 
     ign closeMultilineCommentStr) <|o 
+0

Ach, cudowne! Byłem rozproszony, myśląc, że to będzie jakiś głęboki problem leżący u podstaw parsera, ale okazuje się, że był to boolean, który określiłem bezmyślnie! Dziękuję Ci! –

+0

Zobacz aktualizację. – Gustavo

+0

Holy-moly, który wygląda na trudny! Cieszę się, że zapytałem! Będę starał się to pogrzebać, dopóki nie będę mógł go zdobyć :) Jeszcze raz dziękuję! –