Có cách nào để phân biệt ngữ pháp LL (k) và LR (k) không?


12

Gần đây tôi đang nghiên cứu về thiết kế Trình biên dịch. Tôi đã biết về hai loại ngữ pháp một là ngữ pháp LL và loại khác là ngữ pháp LR.

Chúng ta cũng biết một sự thật rằng mỗi ngữ pháp LL là LR ngữ pháp LL là một tập hợp con đúng của ngữ pháp LR. Cái đầu tiên được sử dụng trong phân tích cú pháp từ trên xuống và cái thứ hai được sử dụng trong phân tích cú pháp từ dưới lên.

Nhưng có cách nào để chúng ta có thể nói rằng một ngữ pháp nhất định là LL hoặc LR không?


3
Làm thế nào về việc sử dụng các kỹ thuật chính tắc để tạo các bảng L R ( k ) và kiểm tra xem chúng có chứa xung đột không? L L ( 1 )L R ( 1 ) thường được xử lý trong bất kỳ sách giáo khoa tiêu chuẩn nào về phân tích cú pháp; các L L ( k )L R ( k ) kỹ thuật là một chút khó khăn hơn để tìm, nhưng cũng là nổi tiếng. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Alex ten Brink

@AlextenBrink Âm thanh này như thể bạn có thể đưa ra câu trả lời! (Chào mừng trở lại, bạn đã bỏ lỡ!)
Raphael

Sử dụng kỹ thuật chính tắc để kiểm tra xem một ngữ pháp là LL hay LR là đúng nhưng là một cách dài. Tôi đang cố gắng tìm một cách nhỏ để tìm thấy cái này mà tôi đã tìm thấy trong cuốn sách Trình biên dịch của Aho-Lam-Sethi-Ullman.
Nợ

Câu trả lời:


11

L R ( k ) tốt không chỉ vì chúng có thể được phân tích cú pháp hiệu quả mà còn bởi vì chúng ta có thể kiểm tra xem một ngữ pháp là L L ( k ) hay L R ( k )LL(k)LR(k)LL(k)LR(k)và bởi vì chúng ta có thể tạo các bảng cho chúng (các bảng phân tích được sử dụng để phân tích các chuỗi đầu vào). Lưu ý rằng đối với hai lớp này, việc có bảng phân tích cú pháp ngay lập tức cho phép bạn kiểm tra xem các ngữ pháp có trong các lớp hay không, bởi vì điều này là như vậy nếu và chỉ khi các bảng không có lỗi. Ngoài ra, có, có các lớp ngữ pháp mà chúng ta có thể phân tích cú pháp một cách hiệu quả nếu chúng ta có một bảng phân tích cú pháp, nhưng chúng ta không thể tạo bảng nếu nó tồn tại.

Bất kỳ sách giáo khoa về các phương pháp phân tích cú pháp sẽ dạy cho bạn cách tạo các bảng cho các phương thức và cũng có thể cho L R ( 1 ) (mặc dù S L R ( 1 ) phổ biến hơn). Các sách giáo khoa như Lý thuyết phân tích của Sippu và Soisalon-Soininen cũng xử lý việc tạo bảng phân tích cú pháp cho các ngữ pháp L L ( k )L R ( k ) .LL(1)LR(1)SLR(1)LL(k)LR(k)

Thật không may, đối với các ngữ pháp thực sự kỳ lạ, các bảng phân tích cho L R ( k ) (mặc dù không phải cho L L ( 1 ) ) có thể nổ tung và trở nên khổng lồ; họ sẽ làm điều này ngay cả đối với các ngữ pháp thông thường nếu k đủ cao. Có sẵn các bài kiểm tra có thể kiểm tra xem một ngữ pháp là L L ( k ) hay L R ( k )LL(k)LR(k)LL(1)kLL(k)LR(k)hoặc không chạy trong thời gian đa thức (tạo bảng là theo cấp số nhân). Để biết chi tiết, đọc sách giáo khoa ở trên. Lưu ý rằng trong rất nhiều trường hợp, bảng có kích thước hợp lý, do đó không cần thử nghiệm.

Nếu bạn không muốn thử các giá trị của để xem chương trình của bạn có hoạt động không, nhưng thay vào đó, muốn máy tính của bạn tìm ra liệu có tồn tại giá trị k sao cho ngữ pháp của bạn là L L ( k ) hay L R ( k ) , bạn không may gặp may, vì điều này là không thể. Nếu ngữ pháp của bạn là L R ( k ) đối với một số k , bạn có thể quyết định liệu ngữ pháp của bạn có phải là L L ( c ) đối với một số c hay không , có thể khác với kkkLL(k)LR(k)LR(k)kLL(c)ck(xem tại đây để biết chi tiết).


Bạn có tình cờ biết nơi tôi có thể tìm thấy các chi tiết của thuật toán đa thức thời gian để kiểm tra nếu một ngôn ngữ là LR (k) (ngoài việc mua sách giáo khoa) không?
dùng541686

2

Chúng ta chỉ phải kiểm tra xem một ngữ pháp có phải là LL hay không bởi vì mọi ngữ pháp LL là LR là LL là tập con đúng của LR. Vì vậy, nếu một ngữ pháp là LL thì nó phải là LR nhưng mọi LR không phải là LL.

Một ngữ pháp G có trong LL iff bất cứ khi nào A-> C | D, điều kiện sau đây sẽ được giữ:

  1. Đầu tiên (C) và Đầu tiên (D) là các tập hợp rời rạc.
  2. Nếu khoảng trống nằm trong First (D) thì First (C) và Follow (A) là các tập hợp rời rạc tương tự như vậy là trống trong First (C).
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.