2012-01-10 19 views

Trả lời

16

Vâng, theo như ngữ pháp có liên quan, dễ dàng của nó - bất kỳ ngữ pháp đệ quy trái đơn giản nào là LR (có thể LR (1)) và không phải LL. Vì vậy, một danh sách ngữ pháp như:

list ::= list ',' element | element 

là LR (1) (giả định sản xuất cho phần tử) nhưng không phải LL. Những ngữ pháp như vậy có thể được chuyển đổi dễ dàng thành các ngữ pháp LL bằng cách thừa nhận trái và như vậy, do đó, điều này không quá thú vị.

Quan tâm nhiều hơn là NGÔN NGỮ không phải là LR mà không phải LL - đó là ngôn ngữ có ngữ pháp LR (1) nhưng không có ngôn ngữ LL (k) cho bất kỳ k nào. Một ví dụ là những thứ cần các kết quả phù hợp tùy chọn. Ví dụ: ngôn ngữ của bất kỳ số nào của a biểu tượng được theo sau bởi cùng một số hoặc ít hơn b biểu tượng, nhưng không nhiều hơn b s - {a^i b^j | i> = j}. Có một ngữ pháp LR (1) tầm thường:

S ::= a S | P 
P ::= a P b | \epsilon 

nhưng không có LL (k) ngữ pháp. Lý do là ngữ pháp LL cần quyết định xem có khớp cặp a + b hay kỳ quặc khi xem a, trong khi ngữ pháp LR có thể trì hoãn quyết định đó cho đến sau khi nó thấy b hoặc kết thúc của đầu vào.

This post trên cs.stackechange.com có ​​rất nhiều tài liệu tham khảo về điều này

+0

Điều đó có vẻ khó xảy ra. Ngữ pháp đó dường như khớp với câu lệnh 'if/else' tốt hơn,' statement :: = if (...) | if (...) statement else (...) statement'. Điều này, theo như tôi biết, được xử lý bởi các trình phân tích cú pháp LL tốt. – Puppy

+0

@DeadMG: Như bạn lưu ý, ngữ pháp khác lúng túng là cùng một mẫu, đó là lý do tại sao nó không LL và không thể được xử lý sạch bởi bất kỳ trình phân tích cú pháp LL nào. Tất nhiên, với một trình phân tích cú pháp viết tay, bạn có thể sử dụng một cách giải quyết đặc biệt (thường là một trình phân tích LR nhỏ cho trường hợp này), nhưng điều đó không thay đổi thực tế rằng ngữ pháp không phải là LL –

+0

Thú vị. Điều đó có nghĩa rằng hầu như * tất cả * ngôn ngữ theo cấu trúc này có các ngôn ngữ không phải LL, và hầu như tất cả các trình tạo phân tích cú pháp LL phải có cách giải quyết? – Puppy