Máy phân tích cú pháp SLR, LALR và LR đều có thể được thực hiện bằng cách sử dụng chính xác cùng một máy theo bảng.
Về cơ bản, các thuật toán phân tích cú pháp thu thập đầu vào tiếp theo thẻ T, và tư vấn tình trạng S hiện tại (và liên lookahead, GOTO, và bảng giảm) để quyết định những việc cần làm:
- SHIFT: Nếu hiện tại bảng nói đến SHIFT trên mã thông báo T, cặp (S, T) được đẩy lên ngăn xếp phân tích cú pháp, trạng thái được thay đổi theo những gì bảng GOTO nói cho mã thông báo hiện tại (ví dụ, GOTO (T)), một mã thông báo đầu vào khác T 'được tìm nạp và quá trình lặp lại
- GIẢM: Mỗi trạng thái có 0, 1 hoặc nhiều lần giảm có thể xảy ra trong tiểu bang. Nếu trình phân tích cú pháp là LR hoặc LALR, mã thông báo được kiểm tra đối với các bộ lookahead cho tất cả các phép cắt hợp lệ cho trạng thái. Nếu mã thông báo khớp với tập hợp lookahead để giảm quy tắc ngữ pháp G = R1 R2 .. Rn, giảm và thay đổi ngăn xếp xảy ra: hành động ngữ nghĩa cho G được gọi, ngăn xếp được bật n (từ Rn) lần, cặp (S, G) được đẩy lên ngăn xếp, trạng thái S mới được đặt thành GOTO (G) và chu trình lặp lại với cùng mã thông báo T. Nếu trình phân tích cú pháp là trình phân tích cú pháp SLR, có nhiều nhất một quy tắc giảm cho nhà nước và vì vậy hành động giảm có thể được thực hiện một cách mù quáng mà không cần tìm kiếm để xem mức giảm nào được áp dụng. Nó rất hữu ích cho một trình phân tích cú pháp SLR để biết liệu có là giảm hay không; điều này rất dễ dàng để biết liệu mỗi tiểu bang có ghi lại rõ ràng số lượng giảm liên quan đến nó hay không, và số đó là cần thiết cho các phiên bản L (AL) R trong thực tế.
- L ERI: Nếu không thể thực hiện cả SHIFT lẫn REDUCE, lỗi cú pháp sẽ được khai báo.
Vì vậy, nếu tất cả chúng đều sử dụng cùng một máy móc, thì vấn đề là gì?
Giá trị mục tiêu trong SLR là tính đơn giản của nó trong việc triển khai; bạn không phải quét qua các bộ kiểm tra có thể cắt giảm có thể do có nhiều nhất, và đây là hành động khả thi duy nhất nếu không có SHIFT thoát khỏi tiểu bang. Mức giảm nào được áp dụng có thể được gắn riêng cho tiểu bang, do đó, máy phân tích cú pháp SLR không phải tìm kiếm nó. Trong thực tế, các trình phân tích cú pháp R (AL) R xử lý một tập hợp langauges có ích hơn và rất ít công việc để thực hiện không ai thực hiện SLR ngoại trừ một bài tập học thuật.
Sự khác biệt giữa LALR và LR phải làm với bảng máy phát điện. Máy phát điện phân tích LR theo dõi tất cả các giảm có thể từ các trạng thái cụ thể và bộ nhìn chính xác của chúng; bạn kết thúc với các trạng thái trong đó mọi giảm được kết hợp với bộ nhìn chính xác của nó từ ngữ cảnh bên trái của nó. Điều này có xu hướng xây dựng các bộ trạng thái khá lớn. Các trình tạo trình phân tích cú pháp LALR sẵn sàng kết hợp các trạng thái nếu các bảng GOTO và các bộ đầu để cắt giảm tương thích và không xung đột; điều này tạo ra số lượng nhỏ hơn đáng kể các trạng thái, với mức giá không thể phân biệt các chuỗi ký hiệu nhất định mà LR có thể phân biệt. Vì vậy, các trình phân tích cú pháp LR có thể phân tích một bộ ngôn ngữ lớn hơn các trình phân tích cú pháp LALR, nhưng có các bảng phân tích cú pháp lớn hơn rất nhiều. Trong thực tế, người ta có thể tìm thấy các ngữ pháp LALR đủ gần với các langau đích mà kích thước của máy trạng thái đáng được tối ưu hóa; những nơi mà trình phân tích cú pháp LR sẽ được xử lý tốt hơn bằng cách kiểm tra đặc biệt bên ngoài trình phân tích cú pháp.
Vì vậy: Cả ba đều sử dụng cùng một máy móc. SLR là "dễ dàng" trong ý nghĩa rằng bạn có thể bỏ qua một chút nhỏ của máy móc, nhưng nó chỉ là không có giá trị rắc rối. LR phân tích một tập hợp các langauges rộng hơn nhưng các bảng trạng thái có xu hướng khá lớn. Điều đó khiến LALR trở thành sự lựa chọn thực tế.
Có nói tất cả điều này, nó là giá trị biết rằng GLR parsers có thể phân tích bất kỳ bối cảnh ngôn ngữ miễn phí, sử dụng máy móc thiết bị phức tạp hơn nhưng chính xác các bảng cùng (bao gồm cả phiên bản nhỏ hơn được sử dụng bởi LALR). Điều này có nghĩa là GLR mạnh hơn LR, LALR và SLR; khá nhiều nếu bạn có thể viết một ngữ pháp BNF chuẩn, GLR sẽ phân tích theo nó. Sự khác biệt trong máy móc là GLR sẵn sàng thử nhiều phân tích cú pháp khi có xung đột giữa bảng GOTO và các bộ lookahead. (Làm thế nào GLR thực hiện điều này một cách hiệu quả là thiên tài tuyệt đối [không phải của tôi] nhưng sẽ không phù hợp trong bài SO này).
Điều đó đối với tôi là một thực tế vô cùng hữu ích. Tôi xây dựng các trình phân tích chương trình và các trình biến đổi mã và trình phân tích cú pháp là cần thiết nhưng "không quan tâm"; công việc thú vị là những gì bạn làm với kết quả được phân tích cú pháp và do đó trọng tâm là làm công việc hậu phân tích cú pháp. Sử dụng GLR có nghĩa là tôi có thể tương đối dễ dàng xây dựng các ngữ pháp làm việc, so với việc hack một ngữ pháp để có được dạng LALR có thể sử dụng được. Điều này rất quan trọng khi cố gắng đối phó với các ngôn ngữ không học thuật như C++ hoặc Fortran, nơi bạn thực sự cần hàng nghìn quy tắc để xử lý toàn bộ ngôn ngữ, và bạn không muốn dành cả cuộc đời để cố gắng thực hiện các quy tắc ngữ pháp đáp ứng các giới hạn của LALR (hoặc thậm chí LR).
Như một loại ví dụ nổi tiếng, C++ được coi là cực kỳ khó phân tích ... bởi những kẻ làm phân tích cú pháp LALR. C++ là đơn giản để phân tích cú pháp bằng cách sử dụng máy móc GLR sử dụng khá nhiều quy tắc được cung cấp ở mặt sau của hướng dẫn tham khảo C++. (Tôi có trình phân tích cú pháp chính xác như vậy, và nó xử lý không chỉ vani C++, mà còn có nhiều phương ngữ của nhà cung cấp. Điều này chỉ có thể thực hiện được vì chúng tôi đang sử dụng trình phân tích cú pháp GLR, IMHO).
[EDIT tháng 11 năm 2011: Chúng tôi đã mở rộng trình phân tích cú pháp của mình để xử lý tất cả C++ 11. GLR giúp dễ dàng hơn nhiều.]
tốt, ngay cả khi tôi đang tìm câu trả lời đúng về điều này, LALR (1) chỉ là một sửa đổi nhỏ của LR (1), nơi kích thước bảng được giảm để chúng tôi có thể giảm thiểu việc sử dụng bộ nhớ ... – vikkyhacks