2011-12-06 9 views
6

FParsecでs式の言語からlispスタイルのコメントを解析しようとしています。この前のスレッドで1行のコメントを解析するのに少し助けがありました - How to convert an FParsec parser to parse whitespaceFParsecでコメントを解析する方法

これは解決されましたが、複数行のコメントを解析する必要があります。現在のコードは次のとおりです。

/// 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 

残念ながら、multilineCommentの解析は成功しません。これはコンビネータであるため、ブレークポイントを設定したり、動作しない理由を分析することはできません。

なぜそれがうまくいかないのでしょうか?

答えて

4

は、そうでなければ、それはcloseMultilineCommentStr文字列をスキップします偽

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue) 

closeMultilineCommentStrためのブール引数を変更してみてください。

は、ネストされたコメント

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

ああ、素晴らしいで動作するように!私はそれが深い根底にあるパーサの問題であると思うことによって気を散らしましたが、それは私が無意識に指定したブール値でした!ありがとうございました! –

+0

アップデートを参照してください。 – Gustavo

+0

難しそうなホーリー・モリ!私は頼んだことがうれしいです!私はそれを得ることができるまで私はgrokしようとしている:)再びありがとう! –

関連する問題