Vấn đề này là một sự tương tự chính xác của vấn đề khớp dấu ngoặc trong một biểu thức trong đó một số dấu ngoặc gần đã bị bỏ qua. Ở đây "nếu" (hoặc trong ngữ pháp đại diện) là dấu ngoặc đơn mở và "khác" ( ) là dấu ngoặc đơn gần. (Từ chuỗi và , bạn có thể chèn s một cách cơ học bằng cách đặt một cái trước mỗi và một ở cuối.) Bởi vì nó phù hợp hơn với bộ não cha mẹ của tôi, tôi viết như thể đó là vấn đề trong tay.b a b c bmộtbmộtbcb
Độ phân giải "khớp gần nhất" truyền thống khác khớp với từng độ gần với độ mở gần đây nhất chưa từng có. Điều đó có nghĩa là không bao giờ có một mở (hoặc đóng, đối với vấn đề đó) không bao giờ có giữa một mở phù hợp và gần khớp của nó.
Một giải pháp thay thế khả thi sẽ là khớp từng lần đóng với mức mở khả thi sớm nhất chưa từng có. "Khả thi" ở đây có nghĩa là mở có thể được khớp mà không vi phạm lồng cha mẹ (ví dụ: đầu tiên trong không thể phù hợp với cuối cùng ).( ) ( ) )(( ) ( ))
Việc khớp này phải được thực hiện từ bên ngoài, do đó, không khớp với nhau cho đến khi tất cả các cặp kèm theo được khớp. Thực tế này làm cho không thể tạo ra một phép phân tích bằng thuật toán nhìn có giới hạn, vì phép phân tích phải hoạt động từ cả hai đầu, sau khi tách chuỗi thành các phân đoạn khớp hoàn toàn (vì chúng hạn chế phạm vi của các kết quả khớp tiềm năng).
Tuy nhiên, thực tế là trình phân tích cú pháp từ trái sang phải trực tuyến không tồn tại không có nghĩa là không có CFG rõ ràng. (Rõ ràng: một ngôn ngữ palindromic phải được phân tích cú pháp từ cả hai đầu về giữa, nhưng thật dễ dàng để viết một ngữ pháp rõ ràng).
Để tạo ra một ngữ pháp cho vấn đề dấu ngoặc đơn "khớp xa nhất", tôi đã dựa vào thực tế là một mở không thể so sánh được có thể được theo sau bởi một mở phù hợp. Nếu đúng như vậy, thì thuộc tính khớp xa nhất sẽ không được áp dụng vì mở không khớp có thể khớp với đóng mở của khớp, do đó, thực tế là nó không phù hợp vi phạm thuộc tính khớp xa nhất.
Vì vậy, đây là ngữ pháp hơi khó hiểu:
SBạnMT→ U|M→ T|một chữ Ub T|một chữ Ub c|một Mb U→ một Mb M|c→ một T|một c
M U a T a T T U U TS là ký hiệu bắt đầu; là các câu lệnh khớp hoàn toàn; chắc chắn là các câu lệnh chưa từng có (có nghĩa là chúng bao gồm ít nhất một câu chưa từng có , vì vậy chúng không thể để trống) và là một "cái đuôi" chỉ bao gồm s chưa từng có . Thực tế trên về nhân mở chưa từng có thể được đọc trực tiếp từ ngữ pháp: tất cả chưa từng mở ra có nguồn gốc từ , một chỉ có thể xuất hiện ở phần cuối của một và chỉ có thể được theo sau bởi một .MBạnmộtTmộtTTBạnBạnT
Sự vụng về đến từ việc ngăn khớp với chuỗi rỗng. Điều đó ngăn chặn một loạt những gì tôi cho là mơ hồ giả: Chúng là giả mạo theo nghĩa là sự khớp của mở và đóng là giống nhau trong tất cả các phân tích thay thế. Nếu được phép là null, nó cũng sẽ lấy được một chuỗi hoàn toàn cân bằng. Vì , trên thực tế, , dẫn đến một sự mơ hồ trong đó bạn có thể coi hoàn toàn cân bằng là một chuỗi theo sau là một trống rỗng , hoặc một ít hơn theo sau là hoàn toàn cân bằng .U S M ∗ U S M U M UBạnBạnSM*BạnSMBạnMBạn
Có lẽ có một cách giải quyết tốt hơn so với cái tôi đã chọn. Nhưng cái này có vẻ hoạt động và nó chơi tốt với trình phân tích cú pháp GLR của Bison mà tôi đã sử dụng để kiểm tra nó; trình phân tích cú pháp đó phàn nàn về các phân tích mơ hồ trừ khi bạn viết thêm mã để xử lý sự mơ hồ và tôi quá lười để làm điều đó. Tôi đã thử nghiệm nó với chuỗi lên tới 20 lần mở + đóng và dường như nó đã tạo ra một phân tích rõ ràng cho mỗi chuỗi được lồng chính xác, mà không tạo ra các phân tích cú pháp cho các chuỗi được lồng không chính xác.