Đưa ra một chuỗi và CFG, những ký tự nào có thể theo chuỗi (trong các hình thức có nghĩa của CFG)?


10

Hãy là tập hợp các thiết bị đầu cuối và N tập các biểu tượng không đầu cuối của một số bối cảnh tự do văn phạm G .ΣNG

Nói rằng tôi có một chuỗi x một y S ( G ) nơi x , y ( Σ N ) *S ( G ) là những hình thức sentential của G .a(ΣN)+xayS(G)x,y(ΣN)S(G)G

Với , tôi muốn xác định một tập hợp C = { b | w một b z S ( G ) , b Σ N } .GC={bwabzS(G),bΣN}

Để làm rõ, trong trường hợp này, là các chuỗi của thiết bị đầu cuối và không phải thiết bị đầu cuối và b có độ dài một.w,x,y,z,a,bb

Tôi có thể thấy làm thế nào để làm điều này nếu cũng có chiều dài một; mỗi b là một thành viên của tập hợp sau của a (bao gồm cả các thiết bị đầu cuối).aba

Tuy nhiên, tôi tò mò liệu có thể cho một chuỗi các nhân vật. Đối với ứng dụng của tôi, chuỗi không dài hơn nhiều so với phía bên tay phải của sản xuất trong G .aG

Sự khác biệt giữa thiết bị đầu cuối và thiết bị đầu cuối có phần hơi câm trong ứng dụng của tôi bởi vì tôi đang sử dụng một ngữ pháp tổng quát; và tôi tin rằng điều này sẽ không dẫn đến nhiều rắc rối vì có độ dài một.b


1
Ứng dụng của bạn là gì? Bạn đang xây dựng một trình phân tích cú pháp?
Raphael

Chúng ta có thể giả sử ngữ pháp ở bất kỳ dạng bình thường nào không hoặc nó có phải hoạt động cho các ngữ pháp tùy ý không?
Raphael

xy

@Raphael - Tôi đang cố gắng tự động hóa các biến đổi của ngữ pháp L-System ... vì vậy nó không ở dạng bình thường. Trong thực tế, tôi sẽ chỉnh sửa câu hỏi này một lần nữa để làm cho nó chính xác hơn.
Thomas

Tôi hy vọng rằng tôi đã không thay đổi câu hỏi quá nhiều - bây giờ nó có một bản chất hơi khác.
Thomas

Câu trả lời:


6

Tôi sẽ mô tả một thuật toán hoạt động. Đó là thời gian chạy không nên quá tệ. Bạn cũng có thể tính toán trước một chút về điều này.

axyaAA

aax

Chúng tôi sử dụng một thuật toán thích ứng của Earley . Bạn sẽ muốn hiểu thuật toán đó trước. Thuật toán của chúng tôi hoạt động theo cách gần như giống nhau, ngoại trừ các bước khởi tạo và hoàn thành của chúng tôi là khác nhau.

a1a

Bây giờ, chúng tôi thực hiện thuật toán Earley riêng cho mọi mục Earley ban đầu có thể như vậy. Chúng ta không thể đơn giản làm tất cả chúng cùng một lúc, vì các phân tích có thể can thiệp lẫn nhau. Tôi không thể dễ dàng thấy một phương pháp nhanh hơn quay lui ở đây.

LALR(1)LALR(1)

LALR(1)

a

Chỉnh sửa: Tôi nghĩ rằng tôi đã tìm thấy phương pháp loại bỏ hầu hết các chi phí được giới thiệu bằng cách quay lại. Chúng tôi liên kết với mỗi mục Earley một bộ số nhận dạng, là các chuỗi, vì chúng tôi sẽ cần sử dụng tiền tố của các số nhận dạng này. Khi khởi tạo, chúng tôi thêm tất cả các mục ban đầu vào bộ Earley và liên kết một mã định danh duy nhất với mỗi bộ.

Trên các bước quét và dự đoán, các định danh được chuyển sang các mục mới. Các mục Earley trong cùng một bộ Earley chỉ khác nhau trong các định danh của chúng được hợp nhất với nhau bằng cách hợp nhất các định danh của chúng lại với nhau. Lưu ý rằng chúng ta có thể thực hiện các bước quét và dự đoán trên các mục mới này bằng các mã định danh, mà không phải thực hiện bước này cho mỗi mã định danh riêng biệt.

LALR(1)

Về cơ bản, chúng tôi thực hiện quay lui bằng cách sử dụng các mã định danh này, do đó chúng tôi không thực hiện công việc gấp đôi trong các bước quét và dự đoán.


aa

@Thomas Điều đó không quá khó: bạn chỉ đơn giản coi nonterminal là thiết bị đầu cuối cho vị trí cụ thể đó trong phân tích cú pháp: bạn vẫn dự đoán và hoàn thành nó như bình thường, nhưng bạn cũng xem xét nó khi quét.
Alex ten Brink

Vâng, thực sự - bây giờ tôi hiểu giải pháp của bạn, nó không nên tạo ra bất kỳ sự khác biệt nào.
Thomas
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.