2011-12-06 25 views
6

Tôi đang cố gắng phân tích các nhận xét kiểu lisp từ ngôn ngữ biểu thức s bằng FParsec. Tôi đã nhận được một chút trợ giúp với việc phân tích các nhận xét một dòng trong chuỗi trước đó - How to convert an FParsec parser to parse whitespaceCách phân tích nhận xét bằng FParsec

Trong khi điều đó đã được giải quyết, tôi vẫn cần phải phân tích các nhận xét đa dòng. Đây là mã hiện tại -

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

Thật không may, phân tích cú pháp phân biệt nhiều người không bao giờ thành công. Vì đây là một combinator, tôi không thể đặt breakpoint hoặc phân tích lý do tại sao nó sẽ không hoạt động.

Bất kỳ ý tưởng nào tại sao nó không hoạt động?

Trả lời

4

Hãy thử thay đổi đối số bool cho closeMultilineCommentStr false

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue) 

Nếu không nó sẽ bỏ qua các closeMultilineCommentStr chuỗi.

Để làm cho nó làm việc với ý kiến ​​lồng nhau

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

Ah, tuyệt vời! Tôi đã bị phân tâm bởi nghĩ rằng nó sẽ là một số vấn đề phân tích sâu bên dưới, nhưng hóa ra đó là một boolean mà tôi đã chỉ định một cách vô tư! Cảm ơn bạn! –

+0

Xem cập nhật. – Gustavo

+0

Thánh-moly trông khó khăn! Tôi rất vui vì tôi đã hỏi! Tôi sẽ cố gắng để grok rằng cho đến khi tôi có thể nhận được nó :) Cảm ơn một lần nữa! –

Các vấn đề liên quan