2015-09-27 13 views
5

tôi đã tự hỏi nếu có một cách để có được te đầu vào còn lại từ Parsec sau khi nó dừng lại phân tích cú pháp, hoặc nếu đó là một phân tích cú pháp thành công hay thất bại, có lẽ chữ ký này:Nhận đầu vào trái Parsec của

parseRemaining :: Stream s Identity t => Parsec s() a -> SourceName -> s -> (s, Either ParseError a) 

đâu chúng tôi nhận thay vì một số Either ParseError a, chúng tôi cũng nhận được số còn lại Stream s

+1

Cân nhắc sử dụng attoparsec, nó nhanh hơn nhiều và hỗ trợ một phần đối sánh. – arrowd

+0

Tôi không phân tích cú pháp các tệp lớn hoặc bất kỳ thứ gì giống như vậy và theo tôi hiểu, Parsec cung cấp giao diện * dễ dàng hơn *. Tôi sử dụng Parsec vì [câu trả lời này] (http://stackoverflow.com/a/19213247/1276441) – chamini2

Trả lời

0

Hãy xem Megaparsec - một ngã ba hiện đại của Parsec, bắt đầu từ phiên bản 4.2.0 nó cho phép để cung cấp nhà nước tùy chỉnh ở phần đầu của phân tích cú pháp và trích xuất trạng thái phân tích cú pháp ở cuối (nó không quan trọng nếu trình phân tích cú pháp thành công hay thất bại). Điều này cho phép phân tích cú pháp một phần đầu vào, tiếp tục phân tích cú pháp, chỉ định vị trí văn bản ban đầu không chuẩn, v.v. xem runParser'runParserT'.


Tiết lộ: Tôi là một trong những tác giả của Megaparsec.

+0

Tôi là người đã yêu cầu tính năng này, tôi đang sử dụng nó. – chamini2

1

Bạn có thể sử dụng getInput, là trình phân tích cú pháp trả về số đầu vào còn lại.

+0

Điều này sẽ làm việc để nhận đầu vào chỉ trên các phân tích cú pháp thành công. Tôi muốn một cách để có được đầu vào trong cả hai trường hợp. – chamini2

0

Tôi đào một chút vào nội bộ của Parsec và tôi không thể tìm thấy cách dễ dàng để khôi phục thông tin trạng thái (có chứa luồng).

Một giải pháp đặc biệt sẽ kiểm tra lỗi mà bạn nhận được và sau đó sử dụng thông tin vị trí của nó để suy ra nơi phân tích cú pháp đã dừng lại. (Tất nhiên, điều này sẽ chỉ làm việc nếu luồng của mình hỗ trợ tìm kiếm.)

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