Cụm từ hoán vị với phân tích cú pháp LR


16

Một cụm từ hoán vị là một mở rộng của tiêu chuẩn (E) BNF bối cảnh tự do định nghĩa ngữ pháp: một cụm từ hoán vị chứa sản xuất (hoặc tương đương, không thuộc đầu cuối) qua . Ở vị trí của cụm từ hoán vị, chúng tôi muốn thấy mỗi một trong số các sản phẩm này chính xác một lần, nhưng chúng tôi không quan tâm đến việc đặt hàng của các nonterminals này.{A1,,An}nA1An

Ví dụ:

S <- X { A, B, C } Y

tương đương với:

S <- X  A B C  Y
S <- X  A C B  Y
S <- X  B A C  Y
S <- X  B C A  Y
S <- X  C A B  Y
S <- X  C B A  Y

Khái niệm này dường như được giới thiệu trong "Mở rộng ngữ pháp không ngữ cảnh với các cụm từ hoán vị" . Trong đó, nó cũng được mô tả cách phân tích các cụm từ này trong thời gian tuyến tính bằng cách sử dụng trình phân tích cú pháp LL (1).

Bài viết "Phân tích cụm từ hoán vị" mô tả một phương pháp để phân tích các cụm từ hoán vị bằng cách sử dụng các trình kết hợp trình phân tích cú pháp. Đây là hai bài báo duy nhất tôi thấy nói về các cụm từ hoán vị và cách phân tích chúng.

Thấy rằng chúng ta có thể dễ dàng phân tích các loại cụm từ hoán vị này bằng các trình phân tích cú pháp dựa trên LL (1), tôi đoán rằng chúng ta có thể làm tương tự với các trình phân tích cú pháp kiểu LR (1). Câu hỏi của tôi là:

Một ngữ pháp có chứa các cụm từ hoán vị có thể được phân tích cú pháp tuyến tính theo thời gian trong kích thước chuỗi đầu vào bằng cách sử dụng máy móc LR (1) trong khi duy trì một bảng có kích thước hợp lý không?

Các cụm từ hoán vị không mở rộng sức mạnh của các ngôn ngữ không ngữ cảnh: như trong ví dụ của tôi ở trên, người ta có thể chỉ cần liệt kê tất cả các hoán vị có thể. Tuy nhiên, ngữ pháp sau đó phát nổ khi ngữ pháp kết quả có thể có kích thước . Điều này cho phép phân tích thời gian tuyến tính, nhưng kích thước của ngữ pháp trở nên quá lớn.Ôi(|G|!)

Cách tiếp cận trên hoạt động cho bất kỳ thuật toán phân tích cú pháp nào (mặc dù nó không hữu ích), vì vậy có lẽ chúng ta có thể làm tốt hơn cho các thuật toán cụ thể. Chúng ta có thể giảm số lần thổi xuống 'chỉ' theo cấp số nhân ( ) bằng cách mã hóa các cụm từ vào bảng LR: chúng ta có thể mã hóa các mục LR mà sản phẩm chưa được nhìn thấy, và do đó làm giảm việc thổi phồng cho tất cả các tập hợp con của cụm từ hoán vị.Ôi(2|G|)

Mặc dù điều này tốt hơn, nhưng tất nhiên là không đủ tốt - có một cụm từ hoán vị gồm 30 mục sẽ làm cho ngữ pháp không thể sử dụng được. Vẫn còn một phần của phân tích cú pháp LR mà chúng ta chưa chạm tới và đó là quy trình dựa trên ngăn xếp thực tế được sử dụng để phân tích cú pháp. Tôi tưởng tượng việc lưu trữ các quầy trên ngăn xếp có thể giải quyết vấn đề, nhưng tôi không chắc làm thế nào để làm điều đó.

Tôi hiện đang triển khai trình tạo trình phân tích cú pháp và trong cụm từ hoán vị miền có vấn đề sẽ là một món quà từ thiên đường. Khi tôi đang sử dụng máy móc LR (1), câu hỏi trên tiếp theo.


Độ phức tạp của phân tích cú pháp LR (1) đã theo cấp số nhân về kích thước của ngữ pháp mà không có cụm từ hoán vị --- ngoại trừ nếu bạn triển khai tính toán "nhanh chóng" của trình phân tích cú pháp, nhưng sau đó nó có cảm giác giống như trình phân tích cú pháp Earley hơn là chính hãng LR (1) một.
Sylvain

2
Về phần còn lại của câu hỏi của bạn: cstheory.stackexchange.com/questions/4962/ cho thấy mức thấp hơn theo cấp số nhân về kích thước của CFG cho hoán vị, và bằng cách xây dựng CFG đa thức thông thường từ các PDA, điều này đòi hỏi mức độ thấp hơn theo cấp số nhân kích thước của các PDA là tốt.
Sylvain

1
Tôi đã không nhìn vào bài báo về LL (1). Thật vậy, trình phân tích cú pháp được triển khai không còn là một thiết bị PDA nữa. Tôi vẫn không tin vào sự tồn tại của một "bảng có kích thước hợp lý", vì tư cách thành viên của các ngữ pháp không ngữ cảnh giao hoán là NP-đầy đủ (xem ví dụ dx.doi.org/10.3233/FI-1997-3112 ), nhưng đó là sự thật rằng các trường hợp cứng có thể không phải là LR (1).
Sylvain

2
@Sylvain: Bạn có thể giải thích về câu hỏi 4962 liên quan đến câu hỏi này như thế nào không? Trong câu hỏi 4962, hoán vị được cố định cho mỗi độ dài đầu vào và các chuỗi được hoán vị thay đổi. Trong câu hỏi hiện tại, chúng tôi không sửa chữa hoán vị. Vì vậy, tôi không thấy bất kỳ kết nối thực sự giữa họ.
Tsuyoshi Ito

2
@Tsuyoshito Ito: Trong LR (1) phân tích cú pháp DPDA tương đương với ngữ pháp đầu vào được xây dựng trước tiên và sau đó chạy theo chuỗi để nhận ra. Vì tồn tại một CFG có kích thước tuyến tính với các cụm từ hoán vị cho mọi ngôn ngữ hoán vị, bài viết của Yuval Filmus (toàn diện hơn câu trả lời của ông trên cstheory: xem cs.toronto.edu/~yuvalf/CFG-LB.pdf ) cho thấy không DPDA như vậy có thể có kích thước đa thức theo kích thước của ngữ pháp đầu vào.
Sylvain

Câu trả lời:


1

Bạn đã xem xét chuyển đổi này thành một vấn đề ngữ nghĩa? Thay vì các quy tắc ngữ pháp cho tất cả các hoán vị của nonterminals {A, B, C}, chỉ cần có một quy tắc để nhận ra (A | B | C) ^ 3 cùng với mã nội bộ đặc biệt đảm bảo chỉ một trong số đó được công nhận, nếu không, nó sẽ tuyên bố một lỗi. Tôi sẽ chèn một sản phẩm trống trước mệnh đề trên, phần giảm của nó kích hoạt khởi tạo bất cứ thứ gì bạn đang sử dụng để đếm A, B, và C, và một sau đó, việc giảm kích hoạt kiểm tra bộ đếm và (nếu cần) sẽ xác nhận lỗi. (tất nhiên điều này có thể hơi rắc rối nếu ngữ pháp được đệ quy thông qua A, B và / hoặc C)


0

Tôi không nghĩ người ta cần một quầy. Về cơ bản, bạn chỉ cần kiểm tra tất cả các hoán vị nhưng phá vỡ

mã giả:

perm-match(input, pattern)
     if pattern = nil return true

     foreach(rule in pattern)
         if (match(input, rule))
             perm-match(input - matchedpart, pattern - rule)
             break
         end
     end
     return false
end

Dưới đây là một ví dụ cụ thể hơn

Giả sử chúng ta đang cố gắng khớp bất kỳ hoán vị của abcd và chuỗi của chúng ta là bcda

  • Bước 1: Tìm biểu tượng phù hợp đầu tiên. Trong trường hợp này là b
  • Bước 2: Xóa biểu tượng đó khỏi mẫu của chúng tôi và giảm chuỗi: ví dụ: acd và cda còn lại
  • Bước 3: Lặp lại bước 1 trên chuỗi mới
    • c trận đấu trong cda mà để lại cho chúng tôi với quảng cáo và da
    • một trận đấu trong da khiến chúng ta có d và d
    • d khớp trong d khiến chúng ta có con số không trong cả hai chuỗi

Vì vậy, bạn thấy thuật toán đơn giản này có thể kiểm tra hoán vị khá dễ dàng bằng cách đơn giản so sánh "chuỗi" không theo thứ tự. Lưu ý rằng độ phức tạp của hàm là trường hợp xấu hơn O (n!) Và trường hợp tốt nhất O (1). Theo một nghĩa nào đó, chúng ta đang giữ số lượng bằng cách lưu trữ các biểu tượng để khớp trong một mảng. Tôi nghĩ rằng điều này sẽ "nhanh" nói chung vì người ta sẽ không đối phó với n rất lớn trong hầu hết các trường hợp.


2
Vấn đề của tôi là: của tôi trở nên rất lớn - n =nn= =50
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.