Sự khác biệt giữa trình phân tích cú pháp LR, SLR và LALR là gì?


103

Sự khác biệt thực tế giữa trình phân tích cú pháp LR, SLR và LALR là gì? Tôi biết rằng SLR và LALR là các loại trình phân tích cú pháp LR, nhưng sự khác biệt thực tế về bảng phân tích cú pháp của chúng là gì?

Và làm thế nào để chỉ ra một ngữ pháp là LR, SLR hay LALR? Đối với ngữ pháp LL, chúng ta chỉ cần chỉ ra rằng bất kỳ ô nào của bảng phân tích cú pháp không được chứa nhiều quy tắc sản xuất. Bất kỳ quy tắc tương tự nào cho LALR, SLR và LR?

Ví dụ, làm thế nào chúng tôi có thể chỉ ra rằng ngữ pháp

S --> Aa | bAc | dc | bda
A --> d

là LALR (1) chứ không phải SLR (1)?


EDIT (ybungalobill) : Tôi không nhận được câu trả lời thỏa đáng cho sự khác biệt giữa LALR và LR. Vì vậy, các bảng của LALR có kích thước nhỏ hơn nhưng nó chỉ có thể nhận ra một tập hợp con các ngữ pháp LR. Ai đó có thể giải thích thêm về sự khác biệt giữa LALR và LR xin vui lòng? LALR (1) và LR (1) sẽ là đủ cho một câu trả lời. Cả hai đều sử dụng 1 mã thông báo nhìn trước và cả hai đều được điều khiển bằng bảng! Chúng khác nhau như thế nào?


tốt, ngay cả khi tôi đang tìm kiếm câu trả lời thích hợp cho vấn đề này, LALR (1) chỉ là một sửa đổi nhỏ của LR (1), trong đó kích thước bảng được giảm xuống để chúng tôi có thể giảm thiểu việc sử dụng bộ nhớ ...
vikkyhacks

Câu trả lời:


64

Tất cả các trình 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 điều khiển bảng.

Về cơ bản, thuật toán phân tích cú pháp thu thập mã thông báo đầu vào tiếp theo T và tham khảo trạng thái hiện tại S (và các bảng tìm kiếm, GOTO và rút gọn được liên kết) để quyết định phải làm gì:

  • SHIFT: Nếu bảng hiện tại cho biết SHIFT trên mã thông báo T, cặp (S, T) được đẩy vào 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 cho biết đối với 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 tiểu bang đều có 0, 1 hoặc nhiều mức 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 sẽ được kiểm tra dựa trên bộ lookahead cho tất cả các lần giảm hợp lệ cho trạng thái. Nếu mã thông báo khớp với bộ lookahead để giảm quy tắc ngữ pháp G = R1 R2 .. Rn, giảm và dịch chuyển 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 mới S 'được đặt thành GOTO (G) và chu kỳ lặp lại với cùng một mã thông báo T. Nếu trình phân tích cú pháp là trình phân tích SLR, có nhiều nhất một quy tắc giảm cho và do đó, 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 phân tích cú pháp SLR để biết nếu có giảm hay không; điều này thật dễ dàng để biết nếu mỗi trạng thái ghi lại rõ ràng số lần giảm liên quan đến nó và số lượng đó vẫn cần thiết cho các phiên bản L (AL) R trong thực tế.
  • LỖI: Nếu cả SHIFT và REDUCE đều không thể thực hiện được, lỗi cú pháp được khai báo.

Vì vậy, nếu tất cả họ đều sử dụng cùng một máy móc, thì vấn đề là gì?

Giá trị được đề xuất trong SLR là sự đơn giản trong việc thực hiện; bạn không phải quét qua các bộ lookahead kiểm tra giảm thiểu có thể có vì chỉ có nhiều nhất một bộ và đây là hành động khả thi duy nhất nếu không có SHIFT thoát khỏi trạng thái. Mức giảm nào áp dụng có thể được đính kèm cụ thể vào tiểu bang, vì vậy máy móc phân tích cú pháp SLR không cần phải tìm kiếm nó. Trong thực tế, trình phân tích cú pháp L (AL) R xử lý một tập hợp các ngôn ngữ lớn hơn một cách hữu ích và quá ít công việc để triển khai nên không ai triển khai SLR ngoại trừ như một bài tập học thuật.

Sự khác biệt giữa LALR và LR liên quan đến trình tạo bảng. Trình tạo phân tích cú pháp LR theo dõi tất cả các mức giảm có thể xảy ra từ các trạng thái cụ thể và bộ tìm kiếm 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 lần giảm được liên kết với bộ tiêu đề chính xác 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 tập hợp trạng thái khá lớn. Trình tạo phân tích cú pháp LALR sẵn sàng kết hợp các trạng thái nếu bảng GOTO và bộ tìm kiếm để giảm thiểu tương thích và không xung đột; điều này tạo ra số lượng trạng thái nhỏ hơn đáng kể, với cái giá là 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, trình phân tích cú pháp LR có thể phân tích cú pháp một nhóm ngôn ngữ lớn hơn trình phân tích cú pháp LALR, nhưng 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 ngữ pháp LALR đủ gần với ngôn ngữ đích mà kích thước của máy trạng thái đáng để tối ưu hóa;

Vì vậy: Cả ba đều sử dụng máy móc như nhau. SLR là "dễ dàng" theo nghĩa là bạn có thể bỏ qua một chút nhỏ của máy móc nhưng nó không đáng để gặp rắc rối. LR phân tích cú pháp một tập hợp các ngôn ngữ 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 là lựa chọn thiết thực.

Đã nói tất cả những điều này, cần biết rằng trình phân tích cú pháp GLR có thể phân tích cú pháp bất kỳ ngôn ngữ không có ngữ cảnh nào, sử dụng máy móc phức tạp hơn nhưng chính xác là các bả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 cú pháp 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à hoặc các bộ lookahead. (Cách GLR thực hiện điều này một cách hiệu quả là tuyệt đối thiên tài [không phải của tôi] nhưng sẽ không phù hợp trong bài đăng SO này).

Điều đó đối với tôi là một sự thật vô cùng hữu ích. Tôi xây dựng chương trình phân tích và máy biến áp mã và phân tích cú pháp là cần thiết nhưng "không thú vị"; 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à thực hiện công việc sau 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 ngữ pháp làm việc, so với việc hack ngữ pháp để chuyển sang dạng có thể sử dụng LALR. Điều này rất quan trọng khi cố gắng xử lý các ngôn ngữ không mang tính 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ý tốt toàn bộ ngôn ngữ và bạn không muốn dành cả đời để cố gắng hack các quy tắc ngữ pháp để đáp ứng các hạn chế 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 cú pháp ... bởi những người làm công việc phân tích cú pháp LALR. C ++ dễ dàng 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 ở phía sau của sổ tay tham chiếu C ++. (Tôi chính xác là một trình phân tích cú pháp như vậy và nó xử lý không chỉ vani C ++ mà còn xử lý nhiều phương ngữ khác nhau của nhà cung cấp. Điều này chỉ có thể thực hiện được trong thực tế vì chúng tôi đang sử dụng trình phân tích cú pháp GLR, IMHO).

[CHỈNH SỬA 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 đã làm điều đó dễ dàng hơn rất nhiều. CHỈNH SỬA tháng 8 năm 2014: Hiện đang xử lý tất cả C ++ 17. Không có gì bị hỏng hoặc trở nên tồi tệ hơn, GLR vẫn là tiếng meo meo của con mèo.]


AFAIK C ++ không thể được phân tích cú pháp bằng LR vì nó cần cái nhìn vô hạn về phía trước. Vì vậy, tôi không thể nghĩ ra bất kỳ bản hack nào có thể phân tích cú pháp nó bằng LR. Ngoài ra trình phân tích cú pháp LRE có vẻ đầy hứa hẹn.
Yakov Galka 23/10/10

5
GCC được sử dụng để phân tích cú pháp C ++ bằng cách sử dụng Bison == LALR. Bạn luôn có thể tăng cường trình phân tích cú pháp của mình với goo bổ sung để xử lý các trường hợp (lookahead, is-this-a-typename) khiến bạn đau lòng. Câu hỏi là "Làm thế nào đau đớn một vụ hack?" Đối với GCC, điều đó khá đau đớn, nhưng họ đã làm được. Điều đó không có nghĩa là điều này được khuyến khích, đó là quan điểm của tôi về việc sử dụng GLR.
Ira Baxter

Tôi không hiểu cách sử dụng GLR giúp bạn với C ++ như thế nào. Nếu bạn không biết liệu một cái gì đó có phải là tên kiểu hay không, thì bạn chỉ không biết cách phân tích cú pháp x * y;- việc sử dụng GLR sẽ giúp gì cho việc đó?
user541686

2
Vấn đề là trình phân tích cú pháp GLR sẽ tạo ra cả hai phân tích cú pháp (dưới dạng "(các) cây con không rõ ràng" trong một "cây" phân tích cú pháp tích hợp (thực sự là DAG). Bạn có thể giải quyết phân đoạn con nào bạn muốn giữ lại, sau đó, bằng cách đưa vào thông tin ngữ cảnh. Trình phân tích cú pháp C ++ của chúng tôi rất đơn giản liên quan đến vấn đề này: nó không cố gắng giải quyết vấn đề. Điều đó có nghĩa là chúng tôi không phải làm rối việc xây dựng bảng ký hiệu với phân tích cú pháp, vì vậy cả trình phân tích cú pháp của chúng tôi và cấu trúc bảng ký hiệu cho C ++ là cá nhân sạch sẽ và hậu quả là nhiều từng để xây dựng và duy trì.
Ira Baxter

18

Bộ phân tích cú pháp LALR hợp nhất các trạng thái tương tự trong ngữ pháp LR để tạo ra các bảng trạng thái phân tích cú pháp có cùng kích thước với ngữ pháp SLR tương đương, thường có thứ tự độ lớn nhỏ hơn bảng phân tích cú pháp LR thuần túy. Tuy nhiên, đối với các ngữ pháp LR quá phức tạp để trở thành LALR, các trạng thái được hợp nhất này dẫn đến xung đột trình phân tích cú pháp hoặc tạo ra trình phân tích cú pháp không hoàn toàn nhận ra ngữ pháp LR ban đầu.

BTW, tôi đề cập một vài điều về điều này trong thuật toán bảng phân tích cú pháp MLR (k) của tôi ở đây .

Phụ lục

Câu trả lời ngắn gọn là các bảng phân tích cú pháp LALR nhỏ hơn, nhưng máy móc phân tích cú pháp thì giống nhau. Một ngữ pháp LALR nhất định sẽ tạo ra các bảng phân tích cú pháp lớn hơn nhiều nếu tất cả các trạng thái LR được tạo ra, với rất nhiều trạng thái dư thừa (gần giống nhau).

Các bảng LALR nhỏ hơn vì các trạng thái tương tự (dư thừa) được hợp nhất với nhau, loại bỏ hiệu quả thông tin ngữ cảnh / hướng nhìn mà các trạng thái riêng biệt mã hóa. Ưu điểm là bạn nhận được các bảng phân tích cú pháp nhỏ hơn nhiều cho cùng một ngữ pháp.

Hạn chế là không phải tất cả các ngữ pháp LR đều có thể được mã hóa dưới dạng bảng LALR bởi vì các ngữ pháp phức tạp hơn có nhiều kiểu nhìn phức tạp hơn, dẫn đến hai hoặc nhiều trạng thái thay vì một trạng thái được hợp nhất.

Sự khác biệt chính là thuật toán tạo bảng LR mang nhiều thông tin hơn giữa các chuyển đổi từ trạng thái này sang trạng thái khác trong khi thuật toán LALR thì không. Vì vậy, thuật toán LALR không thể biết liệu một trạng thái đã hợp nhất có thực sự nên được để lại dưới dạng hai hoặc nhiều trạng thái riêng biệt hay không.


3
+1 Tôi thích ý tưởng của Honalee. Trình tạo phân tích cú pháp G / L (AL) R của tôi có chứa hạt giống của một cái gì đó như thế này trong đó; nó tạo ra một cỗ máy LALR tối thiểu, và sau đó tôi sẽ phân chia các trạng thái có xung đột, nhưng tôi chưa bao giờ vượt qua. Đây có vẻ là một cách hay để tạo ra một "LR" có kích thước tối thiểu như tập hợp các bảng phân tích cú pháp. Mặc dù nó sẽ không giúp ích gì cho GLR về những gì nó có thể phân tích cú pháp, nhưng nó có thể cắt giảm số lượng phân tích cú pháp song song mà GLR phải thực hiện và điều đó sẽ hữu ích.
Ira Baxter

12

Tuy nhiên, một câu trả lời khác (YAA).

Các thuật toán phân tích cú pháp cho SLR (1), LALR (1) và LR (1) giống hệt nhau như Ira Baxter đã nói,
tuy nhiên, các bảng phân tích cú pháp có thể khác nhau do thuật toán tạo trình phân tích cú pháp.

Trình tạo phân tích cú pháp SLR tạo ra một máy trạng thái LR (0) và tính toán các thông số từ ngữ pháp (bộ FIRST và FOLLOW). Đây là một cách tiếp cận đơn giản hóa và có thể báo cáo các xung đột không thực sự tồn tại trong máy trạng thái LR (0).

Bộ tạo trình phân tích cú pháp LALR tạo ra một máy trạng thái LR (0) và tính toán các thông số từ máy trạng thái LR (0) (thông qua các chuyển đổi đầu cuối). Đây là một cách tiếp cận đúng, nhưng đôi khi báo cáo xung đột không tồn tại trong máy trạng thái LR (1).

Trình tạo phân tích cú pháp Canonical LR tính toán một máy trạng thái LR (1) và phần nhìn trước đã là một phần của máy trạng thái LR (1). Các bảng phân tích cú pháp này có thể rất lớn.

Trình tạo phân tích cú pháp LR tối thiểu tính toán một máy trạng thái LR (1), nhưng hợp nhất các trạng thái tương thích trong quá trình này, sau đó tính toán các thông số từ máy trạng thái LR (1) tối thiểu. Các bảng phân tích cú pháp này có cùng kích thước hoặc lớn hơn một chút so với các bảng phân tích cú pháp LALR, mang lại giải pháp tốt nhất.

LRSTAR 10.0 có thể tạo ra các trình phân tích cú pháp LALR (1), LR (1), CLR (1) hoặc LR (*) trong C ++, bất cứ thứ gì cần thiết cho ngữ pháp của bạn. Xem sơ đồ này cho thấy sự khác biệt giữa các trình phân tích cú pháp LR.

[Tiết lộ đầy đủ: LRSTAR là sản phẩm của tôi]


5

Giả sử một trình phân tích cú pháp không có lookahead đang vui vẻ phân tích cú pháp các chuỗi cho ngữ pháp của bạn.

Sử dụng ví dụ đã cho của bạn, nó bắt gặp một chuỗi dc, nó làm gì? Nó có giảm nó xuống không S, bởi vì dcmột chuỗi hợp lệ được tạo ra bởi ngữ pháp này? HOẶC có thể chúng tôi đang cố gắng phân tích cú pháp bdcvì thậm chí đó là một chuỗi có thể chấp nhận được?

Như con người, chúng ta biết câu trả lời rất đơn giản, chúng ta chỉ cần nhớ xem chúng ta có vừa phân tích cú pháp bhay không. Nhưng máy tính thật ngu ngốc :)

Vì trình phân tích cú pháp SLR (1) có thêm sức mạnh so với LR (0) để thực hiện tìm kiếm, chúng tôi biết rằng bất kỳ số lượng tìm kiếm nào không thể cho chúng tôi biết phải làm gì trong trường hợp này; thay vào đó, chúng ta cần nhìn lại quá khứ của mình. Do đó, bộ phân tích cú pháp LR chuẩn để giải cứu. Nó nhớ lại bối cảnh quá khứ.

Cách nó ghi nhớ bối cảnh này là nó tự kỷ luật, rằng bất cứ khi nào nó gặp phải b, nó sẽ bắt đầu đi trên con đường hướng tới việc đọc bdc, như một khả năng. Vì vậy, khi nó nhìn thấy một dnó, nó biết liệu nó có đang đi trên một con đường hay không. Do đó trình phân tích cú pháp CLR (1) có thể làm những việc mà trình phân tích cú pháp SLR (1) không thể!

Nhưng bây giờ, vì chúng ta phải xác định rất nhiều đường dẫn, các trạng thái của máy trở nên rất lớn!

Vì vậy, chúng tôi hợp nhất các con đường tìm kiếm giống nhau, nhưng như mong đợi nó có thể làm phát sinh các vấn đề nhầm lẫn. Tuy nhiên, chúng tôi sẵn sàng chấp nhận rủi ro với chi phí giảm kích thước.

Đây là trình phân tích cú pháp LALR (1) của bạn.


Bây giờ làm thế nào để làm điều đó theo thuật toán.

Khi bạn vẽ các bộ cấu hình cho ngôn ngữ trên, bạn sẽ thấy xung đột shift-giảm ở hai trạng thái. Để loại bỏ chúng, bạn có thể muốn xem xét SLR (1), đưa ra quyết định khi xem xét theo dõi, nhưng bạn sẽ quan sát thấy rằng nó vẫn không thể. Vì vậy, bạn sẽ vẽ lại các tập hợp cấu hình nhưng lần này với một hạn chế là bất cứ khi nào bạn tính toán đóng, các sản phẩm bổ sung được thêm vào phải tuân theo (các) nghiêm ngặt. Tham khảo bất kỳ sách giáo khoa nào về những gì sau đây là.


Điều này không chính xác

4

Sự khác biệt cơ bản giữa các bảng phân tích cú pháp được tạo với SLR so với LR, đó là các hành động giảm dựa trên Số lượt theo dõi được đặt cho các bảng SLR. Điều này có thể quá hạn chế, cuối cùng gây ra xung đột giảm chuyển dịch.

Mặt khác, một trình phân tích cú pháp LR, các cơ sở chỉ giảm bớt các quyết định đối với tập hợp các thiết bị đầu cuối thực sự có thể theo sau các thiết bị đầu cuối không được giảm bớt. Tập hợp các thiết bị đầu cuối này thường là một tập hợp con thích hợp của tập hợp Theo dõi của một thiết bị đầu cuối không phải là thiết bị đầu cuối như vậy, và do đó ít có khả năng xung đột với các hành động shift.

Các trình phân tích cú pháp LR mạnh hơn vì lý do này. Tuy nhiên, bảng phân tích cú pháp LR có thể rất lớn.

Một trình phân tích cú pháp LALR bắt đầu với ý tưởng xây dựng một bảng phân tích cú pháp LR, nhưng kết hợp các trạng thái đã tạo theo cách dẫn đến kích thước bảng nhỏ hơn đáng kể. Nhược điểm là một số trường hợp xung đột có thể xảy ra đối với một số ngữ pháp mà bảng LR nếu không sẽ tránh được.

Trình phân tích cú pháp LALR kém mạnh hơn một chút so với trình phân tích cú pháp LR, nhưng vẫn mạnh hơn trình phân tích cú pháp SLR. YACC và các trình tạo phân tích cú pháp khác có xu hướng sử dụng LALR vì lý do này.

PS Nói một cách ngắn gọn, SLR, LALR và LR ở trên thực sự có nghĩa là SLR (1), LALR (1) và LR (1), vì vậy một cái nhìn trước mã thông báo được ngụ ý.


4

Trình phân tích cú pháp SLR nhận ra một tập hợp con ngữ pháp thích hợp có thể nhận ra bởi trình phân tích cú pháp LALR (1), từ đó nhận ra một tập hợp con ngữ pháp thích hợp mà trình phân tích cú pháp LR (1) nhận ra.

Mỗi trạng thái này được xây dựng như một máy trạng thái, với mỗi trạng thái đại diện cho một số tập hợp các quy tắc sản xuất của ngữ pháp (và vị trí trong mỗi) khi nó phân tích cú pháp đầu vào.

Các Rồng Sách ví dụ về một LALR (1) ngữ pháp đó không phải là SLR là thế này:

S → L = R | R
L → * R | id
R → L

Đây là một trong những trạng thái cho ngữ pháp này:

S → L•= R
R → L•

Dấu cho biết vị trí của trình phân tích cú pháp trong mỗi sản phẩm có thể có. Nó không biết nó thực sự nằm trong sản phẩm nào cho đến khi nó kết thúc và cố gắng giảm bớt.

Tại đây, trình phân tích cú pháp có thể thay đổi =hoặc giảm bớt R → L.

Một trình phân tích cú pháp SLR (hay còn gọi là LR (0)) sẽ xác định xem nó có thể giảm hay không bằng cách kiểm tra xem ký hiệu đầu vào tiếp theo có nằm trong tập sau của R(tức là tập hợp tất cả các thiết bị đầu cuối trong ngữ pháp có thể theo sau R) hay không. Vì =cũng nằm trong tập hợp này, trình phân tích cú pháp SLR gặp phải xung đột chuyển-giảm.

Tuy nhiên, trình phân tích cú pháp LALR (1) sẽ sử dụng tập hợp tất cả các thiết bị đầu cuối có thể tuân theo sản xuất cụ thể này của R, chỉ là $(tức là kết thúc của đầu vào). Như vậy, không có xung đột.

Như những người bình luận trước đây đã lưu ý, trình phân tích cú pháp LALR (1) có cùng số trạng thái với trình phân tích cú pháp SLR. Một thuật toán lan truyền hướng nhìn trước được sử dụng để tìm kiếm các sản phẩm trạng thái SLR từ các trạng thái LR (1) tương ứng. Trình phân tích cú pháp LALR (1) kết quả có thể đưa ra xung đột giảm-giảm không có trong trình phân tích cú pháp LR (1), nhưng nó không thể tạo ra xung đột chuyển-giảm.

Trong ví dụ của bạn , trạng thái LALR (1) sau đây gây ra xung đột chuyển-giảm trong triển khai SLR:

S → b d•a / $
A → d• / c

Ký hiệu sau /là bộ theo dõi cho mỗi sản xuất trong trình phân tích cú pháp LALR (1). Trong SLR, follow ( A) bao gồm a, cũng có thể được thay đổi.


2

Ngoài các câu trả lời ở trên, sơ đồ này cho thấy các trình phân tích cú pháp khác nhau liên quan như thế nào:

nhập mô tả hình ảnh ở đây


-2

Một câu trả lời đơn giản là tất cả ngữ pháp LR (1) đều là ngữ pháp LALR (1). So với LALR (1), LR (1) có nhiều trạng thái hơn trong máy trạng thái hữu hạn liên kết (nhiều hơn gấp đôi các trạng thái). Và đó là lý do chính mà ngữ pháp LALR (1) yêu cầu nhiều mã để phát hiện lỗi cú pháp hơn so với ngữ pháp LR (1). Và một điều quan trọng nữa cần biết về hai ngữ pháp này là trong ngữ pháp LR (1), chúng ta có thể có ít xung đột hơn / bớt đi. Nhưng trong LALR (1) có nhiều khả năng giảm / giảm xung đột hơn.

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.