2012-01-17 26 views
5

Có thể gửi đầu vào cho một trình phân tích cú pháp FParsec theo các khối, như từ một ổ cắm không? Nếu không, có thể truy xuất kết quả hiện tại và phần chưa được phân tích của luồng đầu vào để tôi có thể thực hiện điều này không? Tôi đang cố gắng chạy các khối dữ liệu vào từ SocketAsyncEventArgs mà không cần đệm toàn bộ thư.Phân tách cú pháp với FParsec

Cập nhật

Lý do ghi nhận việc sử dụng SocketAsyncEventArgs là để biểu thị rằng việc gửi dữ liệu đến một CharStream có thể dẫn đến truy cập không đồng bộ với cơ bản Stream. Cụ thể, tôi đang xem xét sử dụng bộ đệm tròn để đẩy dữ liệu đến từ ổ cắm. Tôi nhớ tài liệu FParsec lưu ý rằng không thể truy cập một cách không đồng bộ Stream, vì vậy tôi đã lên kế hoạch kiểm soát thủ công phân tích cú pháp chunked.

câu hỏi cuối cùng:

  1. Tôi có thể sử dụng một bộ đệm tròn dưới Stream tôi truyền cho CharStream?
  2. Tôi không cần phải lo lắng về bản thân mình bằng cách kiểm soát việc chunking theo cách thủ công trong trường hợp này?
+0

FParsec hoạt động trên CharStream, vì vậy câu trả lời có thể là có. Tôi sẽ trì hoãn câu trả lời tốt hơn (hy vọng) mặc dù. –

Trả lời

8

Phiên bản bình thường của FParsec (mặc dù không phải là Low-Trust version) lần đọc đầu vào đoạn khôn ngoan, hay "khối khôn ngoan", như tôi gọi nó trong CharStream documentation. Do đó, nếu bạn xây dựng một CharStream từ một số System.IO.Stream và nội dung đủ lớn để trải rộng nhiều khối CharStream, bạn có thể bắt đầu phân tích cú pháp trước khi bạn đã truy xuất đầy đủ đầu vào.

Lưu ý tuy nhiên, rằng CharStream sẽ tiêu thụ dòng đầu vào trong khối của một (nhưng cấu hình) kích thước cố định, tức là nó sẽ gọi phương thức Read của System.IO.Stream thường xuyên như là cần thiết để điền vào một khối hoàn chỉnh. Do đó, nếu bạn phân tích đầu vào nhanh hơn bạn có thể truy xuất đầu vào mới, thì CharStream có thể chặn mặc dù đã có một số đầu vào chưa được phân tích, vì chưa có đủ đầu vào để điền vào một khối hoàn chỉnh.

Cập nhật

Câu trả lời (s) cho những câu hỏi cuối cùng của bạn: 42.

  • Làm thế nào bạn thực hiện Stream từ đó bạn xây dựng CharStream là hoàn toàn tùy thuộc vào bạn. Hạn chế bạn đang nhớ rằng việc loại trừ quyền truy cập song song chỉ áp dụng cho lớp CharStream, không phải là chủ đề an toàn.

  • Thực hiện Stream như một bộ đệm tròn rất có thể sẽ restrict the maximum distance over which you can backtrack.

  • Khối kích thước của CharStream ảnh hưởng thế nào đến nay bạn có thể quay lại khi Stream không hỗ trợ tìm kiếm.

  • Cách đơn giản nhất để phân tích đầu vào không đồng bộ là thực hiện phân tích cú pháp trong tác vụ không đồng bộ (tức là trên một chuỗi nền).Trong nhiệm vụ, bạn có thể chỉ cần đọc socket một cách đồng bộ, hoặc nếu bạn không tin tưởng vào hệ điều hành đệm, bạn có thể sử dụng một lớp luồng như BlockingStream được mô tả trong bài viết bạn đã liên kết trong bình luận thứ hai bên dưới.

  • Nếu đầu vào có thể dễ dàng tách thành các khối độc lập (ví dụ: dòng cho định dạng văn bản dựa trên dòng), bạn có thể tự chunk nó lên và phân tích cú pháp đầu vào.

+0

Cảm ơn, Stephan. Tôi đã sửa đổi câu hỏi của mình để phản ánh tốt hơn những gì tôi đang cố hiểu rõ hơn. Ban đầu tôi rất vui mừng về cách tiếp cận 'CharStream', nhưng lưu ý mà tôi đã tìm thấy trước đây về truy cập không đồng bộ vào' Stream' cơ bản đã khiến tôi tạm dừng. –

+0

Có gì đó giống như tác phẩm này không? http://msdn.microsoft.com/en-us/magazine/cc163290.aspx –

+0

Tôi đã cập nhật câu trả lời của mình. Điều này có trả lời câu hỏi của bạn không? Tôi không chắc chắn rằng lưu ý liên quan đến asynchrounous truy cập vào cơ bản 'Stream' bạn tham khảo chính xác. Bạn có thể viết chính xác nơi bạn tìm thấy ghi chú đó không? –

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