Điểm khỏc biệt giữa phương phỏp phõn tớch LR với phương phỏp phõn tớch LL là: Để cho một văn phạm là LR(k), chỳng ta phải cú khả năng xỏc định được sự xuất hiện của vế phải của

Một phần của tài liệu PHÂN TÍCH CÚ PHÁP VÀ CÁC PHƯƠNG PHÁP PHÂN TÍCH CƠ BẢN (Trang 29 - 32)

một văn phạm là LR(k), chỳng ta phải cú khả năng xỏc định được sự xuất hiện của vế phải của một sản xuất khi đó thấy tất cả quỏ trỡnh dẫn xuất từ vế phải đú với thụng tin thờm là k ký hiệu đầu vào tiếp theo. Điều kiện này rừ ràng là chớnh xỏc hơn so với điều kiện của văn phạm LL(k) là việc sử dụng một sản xuất chỉ dựa vào k ký hiệu đầu vào tiếp theo. Chớnh vỡ vậy mà quỏ trỡnh phõn tớch LR ớt cú xung đột hơn, hay núi cỏch khỏc là văn phạm của nú rộng hơn LL rất nhiều.

2.3.4.2. Một số khỏi niệm.

1) Tiền tố khả tồn (viable prefixes)

Xõu ký hiệu trong ngăn xếp tại mỗi thời điểm của một quỏ trỡnh phõn tớch gạt - thu gọn là một tiền tố khả tồn.

Vớ dụ: tại một thời điểm trong ngăn xếp cú dữ liệu là αβ và xõu vào cũn lại là w thỡ αβw là một dạng cõu dẫn phải và αβ là một tiền tố khả tồn.

2) Mục(Item) : Cho một văn phạm G.

Với mỗi sản xuất A->xy, ta chốn dấu chấm vào tạo thành A->x .y và gọi kết quả này là một mục.

Mục A->x.y cho biết qỳa trỡnh suy dẫn sử dụng sản xuất A->xy và đó suy dẫn đến hết phần x trong sản xuất, quỏ trỡnh suy dẫn tiếp theo đối với phần xõu vào cũn lại sẽ bắt đầu từ y.

Vớ dụ: Luật sinh A ( XYZ cú 4 mục như sau : A→ •XYZ A→ X•YZ A→ XY•Z A→ XYZ• Luật sinh A →ε chỉ tạo ra một mục A →•

3) Mục cú nghĩa (valid item)

Một mục A->β1.β2 gọi là mục cú nghĩa(valid item) đối với tiền tố khả tồn αβ1 nếu tồn tại một dẫn xuất: S =>*rmαAw =>rmαβ1β2w

Một tập mục cú nghĩa đối với một tiền tố khả tồn núi lờn rất nhiều điều trong quỏ trỡnh suy dẫn gạt - thu gọn: Giả sử quỏ trỡnh gạt thu gọn đang ở trạng thỏi với ngăn xếp là x và phần ký hiệu đầu vào là v (*)

ngăn xếp đầu vào

$x v$

thế thỡ, quỏ trỡnh phõn tớch tiếp theo sẽ phụ thuộc vào tập mục cú nghĩa I của tiền tố khả tồn thuộc x. Với một mục [A->β1.β2] I, cho chỳng ta biết x cú dạng αβ1, và quỏ trỡnh phõn tớch phần cũn lại w của xõu đầu vào nếu theo sản xuất A->β1β2 sẽ được tiếp tục từ β2 của mục đú. Hành động gạt hay thu gọn sẽ phụ thuộc vào β2 là rỗng hay khụng. Nếu

β2 = ε thỡ phải thu gọn β1 thành A, cũn nếu β2≠ε thỡ việc phõn tớch theo sản xuất A->β1β2 đũi hỏi phải sử dụng hành động gạt.

Nhận xột:

- Mọi quỏ trỡnh phõn tớch tiếp theo của trạng thỏi (*) đều phụ thuộc vào cỏc mục cú nghĩa trong tập cỏc mục cú nghĩa I của tiền tố khả tồn x.

- Cú thể cú nhiều mục cú nghĩa đối với một tiền tố x. Cỏc mục này cú thể cú cỏc hành động xung đột (bao gồm cả gạt và thu gọn), trong trường hợp này bộ phõn tớch sẽ phải dựng cỏc thụng tin dự đoỏn, dựa vào việc nhỡn ký hiệu đầu vào tiếp theo để quyết định nờn sử dụng mục cú nghĩa nào với tiền tố x (tức là sẽ cho tương ứng gạt hay thu gọn). Nếu quỏ trỡnh này cho những quyết định khụng xung đột (duy nhất) tại mọi trạng thỏi thỡ ta núi văn phạm đú phõn tớch được bởi thuật toỏn LR.

- Tư tưởng của phương phỏp phõn tớch LR là phải xõy dựng được tập tất cả cỏc mục cú nghĩa đối với tất cả cỏc tiền tố khả tồn.

4) Tập chuẩn tắc LR(0)

LR(0) là tập cỏc mục cú nghĩa cho tất cả cỏc tiền tố khả tồn.

LR(0) theo nghĩa: LR núi lờn đõy là phương phỏp phõn tớch LR, cũn số 0 cú nghĩa là số ký tự nhỡn trước là 0.

5) Văn phạm gia tố(Augmented Grammar)(mở rộng)

Văn phạm G - ký hiệu bắt đầu S, thờm một ký hiệu bắt đầu mới S' và luật sinh S'  S để được văn phạm mới G' gọi là văn phạm gia tố.

Vớ dụ: cho văn phạm G gồm cỏc sản xuất S -> aSb | a thỡ văn phạm gia tố của G, ký hiệu là G’ gồm cỏc sản xuất S’-S, S->aSb | a với S’ là ký hiệu bắt đầu.

Ta xõy dựng văn phạm gia tố của một văn phạm theo nghĩa, đối với văn phạm ban đầu, quỏ trỡnh phõn tớch sẽ bắt đầu bởi cỏc sản xuất cú vế trỏi là S. Khi đú, chỳng ta xõy dựng văn phạm gia tố G’ thỡ mọi quỏ trỡnh phõn tớch sẽ bắt đầu từ sản xuất S’->S

Sử dụng hai phộp toỏn: phộp tớnh bao đúng closure(I) của một tập mục I và phộp sinh ra tập mục cho cỏc tiền tố khả tồn mới goto(I,X) như sau:

6) Phộp toỏn closure

Nếu I là một tập cỏc mục của một văn phạm G thỡ closure(I) là tập cỏc mục được xõy dựng từ I bằng hai qui tắc sau:

1. khởi đầu mỗi mục trong I đều được đưa vào closure(I)

2. nếu [A -> α.Bβ] ∈ closure(I) và B->γ là một sản xuất thỡ thờm [B -> .γ ] vào closure(I) nếu nú chưa cú ở đú. Áp dụng qui tắc này đến khi khụng thờm được một mục nào vào closure(I) nữa.

Trực quan:

nếu [A -> α.Bβ] là một mục cú nghĩa đối với một tiền tố khả tồn xα thỡ với B->γ là một sản xuất ta cũng cú [B->.γ] là một mục cú nghĩa đối với tiền tố khả tồn xα.

Phộp toỏn tớnh bao đúng của một mục là để tỡm tất cả cỏc mục cú nghĩa tương đương của cỏc mục trong tập đú.

Theo định nghĩa của một mục là cú nghĩa đối với một tiền tố khả tồn, chỳng ta cú suy dẫn S =>*rm xAy =>rm xαBβy

sử dụng sản xuất B -> γ ta cú suy dẫn S =>*rm xαγβy. Vậy thỡ [B->.γ] là một mục cú nghĩa của tiền tố khả tồn xα

Vớ dụ: Xột văn phạm mở rộng của biểu thức:

E' → E E → E + T | T T → T * F | F F → (E) | id Nếu I là tập hợp chỉ gồm văn phạm {E'→ • E} thỡ closure(I) bao gồm:

E' → • E (Luật 1) E → • E + T (Luật 2) E → • T (Luật 2) T → • T * F (Luật 2) T → • F (Luật 2) F → • (E) (Luật 2) F → • id (Luật 2)

E' → • E được đặt vào closure(I) theo luật 1. Khi cú một E đi ngay sau một

• , bằng luật 2 ta thờm cỏc sản xuất E với cỏc chấm nằm ở đầu trỏi ( E →• E + T và E

→• T). Bõy giờ lại cú T đi theo sau một •, ta lại thờm T →• T * F và T → • F vào. Cuối cựng ta cú Closure(I) như trờn.

Chỳ ý rằng : Nếu một B - luật sinh được đưa vào closure(I) với dấu chấm mục nằm ở đầu vế phải thỡ tất cả cỏc B - luật sinh đều được đưa vào.

* Phộp toỏn goto

goto(I,X) với I là một tập cỏc mục và X là một ký hiệu văn phạm.

goto(I,X) được định nghĩa là bao đúng của tập tất cả cỏc mục [A->αX.β]

sao cho [A->α.Xβ] I.

Nếu I là tập cỏc mục cú nghĩa đối với một tiền tố khả tồn γ nào đú thỡ goto(I,X) là tập cỏc mục cú nghĩa đối với tiền tố khả tồn γX.

gọi tập J=goto(I,X) thỡ cỏch tớnh tập J như sau:

1. nếu [A->α.Xβ] ∈ I thỡ thờm [A->αX.β] vào J

2. J=closure(J)

Phộp toỏn goto là phộp phỏt triển để xõy dựng tất cả cỏc tập mục cho tất cả cỏc tiền tố khả tồn cú thể.

Vớ dụ : Giả sử I = {E' → E•, E → E • + T}. Tớnh goto (I, +) ? Ta cú J = { E→ E + • T}

⇒ goto (I, +) = closure(I') bao gồm cỏc mục : E  E + • T (Luật 1) T  • T * F (Luật 2) T  • F (Luật 2) F  • (E) (Luật 2) F  • id (Luật 2)

Tớnh Goto(I,+) bằng cỏch kiểm tra I cho cỏc mục với dấu + ở ngay bờn phải chấm. E’ → E• khụng phải mục như vậy nhưng E → E • + T thỡ đỳng. Ta chuyển dấu chấm qua bờn kia dấu + để nhận được E → E + • T và sau đú tớnh closure cho tập này.

Như vậy, cho trước một văn phạm, ta cú thể sử dụng hai phộp toỏn trờn để sinh ra tất cả cỏc tiền tố khả tồn cú thể và tập mục cú nghĩa của từng tiền tố khả tồn. Với việc sử dụng phộp tớnh closure và goto như trờn, chỳng ta xõy dựng được tập cỏc mục gọi là tập mục LR(0).

Thuật toỏn xõy dựng LR(0) như sau:

Cho văn phạm G, văn phạm gia tố của nú là G’

Tập C là tập cỏc tập mục LR(0) được tớnh theo thuật toỏn như sau: 1). C = {closure({[S’->.S]})}

2). Đối với mỗi mục I trong C và mỗi ký hiệu văn phạm X, tớnh goto(I,X). Thờm goto(I,X) vào C nếu khụng rỗng và khụng trựng với bất kỳ tập nào cú trong C

Thực hiện bước 2 đến khi nào khụng thờm được tập nào nữa vào C

Một phần của tài liệu PHÂN TÍCH CÚ PHÁP VÀ CÁC PHƯƠNG PHÁP PHÂN TÍCH CƠ BẢN (Trang 29 - 32)