Một cách để tìm ra điều này là cố gắng xây dựng các trình phân tích cú pháp LR (1) và SLR (1) cho ngữ pháp. Nếu chúng tôi tìm thấy bất kỳ thay đổi/giảm hoặc giảm/giảm xung đột nào trong quá trình làm như vậy, chúng tôi có thể cho thấy ngữ pháp đó không thuộc về một trong các loại ngôn ngữ đó.
Hãy bắt đầu với trình phân tích cú pháp SLR (1). Đầu tiên, chúng ta cần tính toán các bộ cấu hình LR (0) cho ngữ pháp. Chúng được thấy ở đây:
(1)
S -> .aA
S -> .bAc
S -> .dc
S -> .bda
(2)
S -> a.A
A -> .d
(3)
S -> aA.
(4)
A -> d.
(5)
S -> b.Ac
S -> b.da
A -> .d
(6)
S -> bA.c
(7)
S -> bAc.
(8)
S -> bd.a
A -> d.
(9)
S -> bda.
(10)
S -> d.c
(11)
S -> dc.
Tiếp theo, chúng ta cần có các bộ THEO D forI cho tất cả các nonterminals. Này được thể hiện ở đây:
FOLLOW(S) = { $ }
FOLLOW(A) = { $, c }
Vì điều này, chúng ta có thể quay trở lại và nâng cấp LR bộ (0) configurating vào SLR (1) bộ configurating:
(1)
S -> .aA [ $ ]
S -> .bAc [ $ ]
S -> .dc [ $ ]
S -> .bda [ $ ]
(2)
S -> a.A [ $ ]
A -> .d [ $, c ]
(3)
S -> aA. [ $ ]
(4)
A -> d. [ $, c ]
(5)
S -> b.Ac [ $ ]
S -> b.da [ $ ]
A -> .d [ $, c ]
(6)
S -> bA.c [ $ ]
(7)
S -> bAc. [ $ ]
(8)
S -> bd.a [ $ ]
A -> d. [ $, c ]
(9)
S -> bda. [ $ ]
(10)
S -> d.c [ $ ]
(11)
S -> dc. [ $ ]
Điều thú vị là đủ, không có xung đột đây! Xung đột thay đổi/giảm có thể xảy ra ở trạng thái (8), nhưng không có xung đột ở đây vì hành động dịch chuyển là a
và mức giảm là trên $
. Do đó, ngữ pháp này thực sự là là SLR (1). Vì bất kỳ ngữ pháp SLR (1) nào cũng là LR (1), điều này có nghĩa là ngữ pháp là cả SLR (1) và LR (1).
Hy vọng điều này sẽ hữu ích!
Nếu bạn đang đi để làm cho một sự nghiệp trong ngành kinh doanh máy tính, bạn cần để học đọc khi bạn không biết gì đó. Đọc kỹ Wikipedia ngôn ngữ LR và làm việc này.Nếu phải mất một thời gian để nhìn chằm chằm vào nó và hiểu, vì vậy hãy là nó; điều này là điển hình. http://en.wikipedia.org/wiki/LR_parser –
Cảm ơn, bạn đã rất hữu ích! –
Trong một cách ngớ ngẩn, có: -} –