2013-04-25 40 views
14

Một vấn đề phổ biến mà tôi có với Parsec là nó có xu hướng bỏ qua đầu vào không hợp lệ nếu nó xảy ra ở vị trí "đúng".Parsec: Tiêu thụ tất cả đầu vào

Là một ví dụ cụ thể, giả sử chúng ta có integer :: Parser Int, và tôi viết

expression = sepBy integer (char '+') 

(Bỏ qua vấn đề khoảng trắng trong chốc lát.)

này phân tích một cách chính xác cái gì đó như "123 + 456 + 789". Tuy nhiên, nếu tôi cho nó ăn "123 + 456-789", nó vui vẻ bỏ qua ký tự "-" bất hợp pháp và phần đuôi của biểu thức; Tôi thực sự muốn có một thông báo lỗi cho tôi biết về đầu vào không hợp lệ, không chỉ có nó âm thầm bỏ qua phần đó.

Tôi hiểu lý do tại sao điều này xảy ra; những gì tôi không chắc chắn là làm thế nào để sửa chữa nó. Phương pháp chung để thiết kế các trình phân tích cú pháp tiêu thụ tất cả đầu vào được cung cấp là gì và chỉ thành công nếu tất cả của nó là một biểu thức hợp lệ?

Trả lời

26

Nó thực sự khá đơn giản - chỉ cần đảm bảo nó tiếp theo eof:

parse (expression <* eof) "<interactive>" "123+456-789" 

eof phù hợp với phần cuối của đầu vào, ngay cả khi đầu vào chỉ là một chuỗi và không phải là một tập tin.

Rõ ràng, điều này chỉ có ý nghĩa ở cấp cao nhất của trình phân tích cú pháp của bạn.

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