2012-06-12 39 views
7

Tôi muốn viết các thử nghiệm cho một bộ phân tích cú pháp Parsec. Dưới đây là một ví dụ đơn giản của một phân tích cú pháp Tôi muốn thử nghiệm với QuickCheck:Kiểm tra trình phân tích cú pháp Parsec bằng cách tạo đầu vào với QuickCheck

identifier = do 
    c <- letter 
    cs <- many (alphaNum <|> oneOf identSymbols) 
    skipSpaces 
    return $ Ident $ c:cs 

Vì vậy, lý tưởng, tôi muốn QuickCheck để tạo ra định danh hợp lệ và chắc chắn rằng tôi nhận được kết quả ngay trở lại, cũng như tạo ra định danh hợp lệ và đảm bảo họ trả lại ParseError. Có bất kỳ tiện ích nào có thể làm cho việc này trở nên dễ dàng hơn không? Có cách nào tôi có thể "chạy phân tích cú pháp của tôi ngược lại", vì vậy để nói chuyện, để tạo ra đầu vào như vậy?

Nói chung, một bộ kiểm tra QuickCheck tốt cho trình phân tích cú pháp này sẽ như thế nào? Ở một mức độ nào đó, có vẻ như tôi về cơ bản phải lặp lại logic của trình phân tích cú pháp trong QuickCheck để đạt được một bài kiểm tra kỹ lưỡng. Đó có thực sự là một ý tưởng hay, hoặc điều này có lẽ là một tình huống mà một công cụ truyền thống như HUnit phù hợp hơn QuickCheck?

Trả lời

13

Nói chung, ngược lại của trình phân tích cú pháp là một máy in đẹp và ngược lại đầu vào ngẫu nhiên với trình phân tích cú pháp, là bản in khá ngẫu nhiên của một AST.

Vì vậy, hãy thực hiện theo các usual approach và xác định một trường hợp tùy ý cho AST của bạn, điều này tạo ra các đoạn cú pháp được tạo thành ngẫu nhiên. Kết hợp một số ký tự sai dưới dạng trình bao bọc để kiểm tra xử lý lỗi.

Xem thêm:

+0

Thuộc tính cụ thể mà tôi thích sử dụng là phân tích cú pháp = phân tích cú pháp. đẹp . phân tích cú pháp. Điều này phục vụ như là một cách phong nha để mô hình hóa các thương lượng thông tin của các phân tích cú pháp, có một điều chỉnh tốt đẹp để lái xe nó từ một góc độ lý thuyết, và nó nắm bắt một thực tế là khá. phân tích cú pháp là idempotent, nếu không phải là chức năng nhận dạng. (Thông thường phân tích cú pháp loại bỏ một số thông tin) –

+2

hai liên kết cuối cùng đã chết –

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