Tôi muốn phân tích các ngôn ngữ cụ thể miền do người dùng xác định. Các ngôn ngữ này thường gần với các ký hiệu toán học (tôi không phân tích ngôn ngữ tự nhiên). Người dùng xác định DSL của họ theo ký hiệu BNF, như thế này:
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
Thích đầu vào 1 + ( 2 * 3 )
phải được chấp nhận, trong khi đầu vào như 1 +
phải bị từ chối là không chính xác và đầu vào như 1 + 2 * 3
phải bị từ chối là mơ hồ.
Một khó khăn trung tâm ở đây là đối phó với các ngữ pháp mơ hồ theo cách thân thiện với người dùng. Hạn chế ngữ pháp không rõ ràng không phải là một lựa chọn: đó là cách ngôn ngữ - ý tưởng là các nhà văn thích bỏ qua dấu ngoặc đơn khi không cần thiết để tránh sự mơ hồ. Miễn là một biểu thức không mơ hồ, tôi cần phân tích nó và nếu không, tôi cần phải từ chối nó.
Trình phân tích cú pháp của tôi phải hoạt động trên mọi ngữ pháp không ngữ cảnh, ngay cả những từ mơ hồ và phải chấp nhận tất cả các đầu vào không rõ ràng. Tôi cần cây phân tích cho tất cả các đầu vào được chấp nhận. Đối với đầu vào không hợp lệ hoặc mơ hồ, lý tưởng nhất là tôi muốn có thông báo lỗi tốt, nhưng để bắt đầu với tôi sẽ lấy những gì tôi có thể nhận được.
Tôi thường sẽ gọi trình phân tích cú pháp trên các đầu vào tương đối ngắn, với đầu vào dài hơn thỉnh thoảng. Vì vậy, thuật toán nhanh hơn tiệm cận có thể không phải là sự lựa chọn tốt nhất. Tôi muốn tối ưu hóa để phân phối khoảng 80% đầu vào dài dưới 20 ký hiệu, 19% từ 20 đến 50 ký hiệu và 1% đầu vào hiếm hơn. Tốc độ cho đầu vào không hợp lệ không phải là một mối quan tâm chính. Hơn nữa, tôi mong đợi một sửa đổi của DSL xung quanh mỗi 1000 đến 100000 đầu vào; Tôi có thể dành vài giây để xử lý ngữ pháp của mình chứ không phải vài phút.
Tôi nên điều tra (các) thuật toán phân tích cú pháp nào, với các kích thước đầu vào điển hình của tôi? Báo cáo lỗi có nên là một yếu tố trong lựa chọn của tôi hay tôi nên tập trung vào phân tích cú pháp đầu vào rõ ràng và có thể chạy một trình phân tích cú pháp chậm hoàn toàn riêng biệt để cung cấp phản hồi lỗi?
(Trong dự án mà tôi cần (một thời gian trước), tôi đã sử dụng CYK , điều này không quá khó để thực hiện và hoạt động đầy đủ cho kích thước đầu vào của tôi nhưng không tạo ra các lỗi rất hay.)
x+y+z
.
+
, do đó, x+y+z
thực sự mơ hồ do đó sai lầm.