2010-08-18 42 views
8

Tôi có định nghĩa cho tệp SPAN (http://www.cme-ch.com/span/spanl300.htm) mà tôi muốn sử dụng trong việc xây dựng trình phân tích cú pháp để phân tích dữ liệu chuỗi thành bộ nhớ trong bộ nhớ lớp học (hoặc thậm chí sử dụng đánh giá lười biếng với từ khóa lợi nhuận.)Tạo một trình phân tích cú pháp chung cho một cấu trúc dữ liệu trong C#

Tất cả các kỹ thuật phân tích cú pháp và thư viện tôi đã thấy áp dụng để xây dựng các cây phân tích cú pháp để triển khai ngôn ngữ; tôi chỉ muốn biết về bất kỳ kỹ thuật tốt nào để phân tích thành một cấu trúc dữ liệu, tương tự như cách XML được phân tích cú pháp thành XMLDocument trong khung .net, nhưng sử dụng các quy tắc được định nghĩa bởi SPAN.

Trả lời

2

SPAN dường như là một loạt các loại bản ghi, mỗi bản ghi có nhiều chi tiết. Cần phải đơn giản để xác định một ngữ pháp cổ điển bao gồm tất cả các bản ghi (như nonterminals), về bất kỳ subrecords (như nonterminals) và kiểu dữ liệu đầu cuối đại diện cho các kiểu dữ liệu khác nhau được xác định bởi SPAN. Có thể có rất nhiều nonterminals, nhưng điều đó chỉ làm cho một ngữ pháp lớn, nhưng không phải là phức tạp.

Hầu hết các ngôn ngữ lập trình có một bộ mã thông báo thiết bị đầu cuối nhỏ thường có thể xuất hiện ở mọi nơi. Sự thật là các ngữ pháp xác định những kỳ vọng về những gì có thể xuất hiện tiếp theo (được gọi là các tập "đầu tiên" và "theo dõi" trong tài liệu phân tích LR), bao gồm một tập các thiết bị đầu cuối rất hạn chế. Ngữ pháp SPAN sẽ không khác; mỗi "phân tích trạng thái" của một trình phân tích cú pháp ngụ ý một tập hợp các thiết bị đầu cuối giới hạn tiếp theo và một tổ chức một trình phân tích cú pháp để tận dụng điều này. (Tôi đã xây dựng các trình phân tích cú pháp L (AL) R, và người ta có thể dễ dàng sử dụng trạng thái "hiện tại" để xác định tập con các thiết bị đầu cuối có thể xảy ra tiếp theo). Vì vậy, một trình phân tích cú pháp SPAN có thể xác định chỉ một tập các thẻ nhỏ có thể xảy ra tiếp theo trong mỗi trạng thái, và sử dụng nó để chọn các characaters bao gồm các mã thông báo tiếp theo (chúng phải tạo thành các bộ phân tách!).

Một cách dễ dàng để thực hiện điều này là với một recursive descent parser.

Vì vậy, tôi cho rằng tất cả những gì máy móc thiết bị phân tích cú pháp sẽ là tốt cho phân tích SPAN, với một số chút công việc tùy chỉnh có thể nhặt các thẻ.

Hành động phân tích cú pháp cho các trình phân tích cú pháp thông thường xây dựng các cây, nhưng dễ dàng để điền các trường của cấu trúc dữ liệu.

1

Điều tra Gardens Point Parser Generator, một ứng dụng tạo trình phân tích cú pháp C# cho bất kỳ ngôn ngữ nào có định nghĩa ngôn ngữ giống như YACC.

2

Đệ quy phong nha là một cách tiếp cận khá đơn giản cho những thứ như thế này.

Bạn bắt đầu với trình bao bọc cho luồng cơ bản cho phép bạn đọc một ký tự (hoặc có thể là thẻ/bản ghi trong trường hợp của bạn).

Sau đó, bạn viết một chuỗi các chức năng làm những việc như 'đọc một số, phân tích cú pháp' và 'đọc một ký tự và kiểm tra xem đó có phải là X' không.

Các chức năng này thành công và chuyển tiếp luồng hoặc không thành công với ngoại lệ phân tích cú pháp. Cuối cùng, rất thuận tiện để tạo ra một bộ tổ hợp các chức năng trên và kết hợp chúng, ví dụ 'đọc A, sau đó đọc B' hoặc 'đọc A, và nếu không thử B thay vào đó'.

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