Là đệ qui trái vì Aa da

Một phần của tài liệu ngôn ngữ lập trình và chương trình dịch (Trang 35 - 37)

- Phương pháp phân tích cơ bản (phương pháp phân tích quay lui: topdown, bottom – up) Phương pháp phân tích hiệu quả (phương pháp phân tích tất định: LL, LR).

Slà đệ qui trái vì Aa da

* Loại bỏ đệ qui trái (loại bỏ suy dẫn A =>+

A )

- Giả sử có luật đệ qui trái A->A | chúng ta thay các luật này bằng các luật: A A‟ và A‟ A‟ |

- Tổng quát hoá lên ta có:

Nếu có các luật đệ qui trái: A A 1 | A 2 | . . .| A m | 1 | 2 | . . .| n

trong đó không i nào bắt đầu bằng A. Thay các sản xuất này bởi các sản xuất: A 1A‟ | 2A‟ | . . . | nA‟ và A‟ 1A‟ | 2A‟ | . . . | mA‟ | Ví dụ2: Xét văn phạm biểu thức số học sau:

{E E + T | T ; T T * F | F; F ( E ) | a}

Loại bỏ đệ qui trái trực tiếp cho các sản xuất của E rồi của T, ta được văn phạm mới không còn sản xuất có đệ qui trái như sau:

{E TE‟; E‟ +TE‟ | ; T FT‟; T‟ *FT‟ | ; F (E) | a} Qui tắc này loại bỏ được đệ qui trái trực tiếp nằm trong các sản xuất nhưng không loại bỏ được đệ qui trái nằm trong các dẫn xuất có hai hoặc nhiều bước. Qui tắc này cũng không loại bỏ được đệ qui trái ra khỏi sản xuất A->A.

Với đệ quy trái và đệ quy gián tiếp ta có thể dùng giải thuật sau để loại bỏ:

Ví dụ: G = { S Aa | b; A Ac | Sd}

Sắp xếp các ký hiệu chưa kết thúc theo thứ tự S,A..

Với i=1, không có đệ qui trái trực tiếp nên không có điều gì xảy ra. Với i=2 , thay luật sinh A Sd được A Aad | bd.

Loại bỏ đệ qui trái trực tiếp cho A, ta được:

S Aa |b; A bdA'; A' cA' | adA' |

1.6 Phép thừa số hoá trái

Thừa số hoá trái (left factoring) là một phép biến đổi văn phạm nhằm sinh ra một văn phạm thích hợp cho việc phân tích cú pháp không quay lui. Ý tưởng cơ bản là khi không rõ sản xuất nào trong trong hai sản xuất có cùng vế trái là A được dùng để khai triển A thì ta có thể viết lại các sản xuất này nhằm “hoãn lại quyết định”, cho đến khi có đủ thông tin để đưa ra được quyết định lựa chọn sản xuất nào.

Input: Văn phạm không không có dạng A + A hoặc A + Output: Văn phạm tương đương không đệ qui trái

Phương pháp:

1. Sắp xếp các ký hiệu không kết thúc theo thứ tự A1, A2.. .. An

2. For i:= 1 to n do Begin

for j:=1 to i-1 do Begin

if ( đệ quy trái gián tiếp của Aj qua Ai) then

Thay sản xuất Ai Aj P bởi sản xuất Ai 1 | 2 | …| n Trong đó Aj 1| 2| …| n P

End;

Loại bỏ đệ qui trái trực tiếp cho Ai End;

- Nếu có hai sản xuất A -> 1 | 2 thì ta không biết phải khai triển A theo

1 hay 2. Khi đó, thay hai sản xuất này bằng: A -> A‟; A‟ -> 1 | 2

Ví dụ: S -> iEtS | iEtSeS | a; E -> b

Khi được thừa số hoá trái, văn phạm này trở thành: S -> iEtSS‟ | a; S‟ -> eS | ; E -> b

Vì thế khi cần khai triển S với ký hiệu xâu vào hiện tại là i, chúng ta có thể lựa chọn iEtSS‟ mà không phải băn khoăn giữa iEtS và iEtSeS của văn phạm cũ. (adsbygoogle = window.adsbygoogle || []).push({});

Giải thuật tạo thừa số hoá trái cho văn phạm: Input: Văn phạm G

Output: Văn phạm tương đương với nhân tố trái. Phương pháp:

Với mỗi ký hiệu chưa kết thúc A, có các ký hiệu dẫn đầu các vế phải giống nhau, ta tìm một chuỗi a là chuỗi có độ dài lớn nhất chung cho tất cả các vế phải (a là nhân tố trái)

Giả sử A ab1| ab2|.. .. | abn | g

Trong đó g không có chuỗi dẫn đầu chung với các vế phải khác. Biến đổi luật sinh thành: A a A' | g ; A' b 1| b 2 | .. .. | b n

Một phần của tài liệu ngôn ngữ lập trình và chương trình dịch (Trang 35 - 37)