III- CÔNG CỤ PHÂN TÍCH CÚ PHÁP YACC
4- Khắc Vụ Lỗi Trong Yacc
1.3 Giải Thuật Phân Tích Cú Pháp Của Earley
Nhập :Văn phạm phi ngữ cảnh G=(N,∑,P,S) và chuổi nhập w= a1a2 … an
thuộc ∑*
Xuất : Danh sách các tập thực thể : I0, I1, … In
Giải Thuật :
• Đầu tiên chúng ta xây dựng tập I0 như sau :
(1) Nếu S α là một luật sinh trong P thì ta cho [S.α , 0] vào trong I0, sau đó thực hiện bước (2) và (3) cho đến khi nào không thể thêm tập thực thể mới vào trong I0 được nữa.
(2) Nếu [B γ . , 0] thuộc I0 (chú ý : γ có thể là ∈) thì cho vào I0 [A αB . β , 0] cho tất cả các thực thể có dạng [A α . Bβ , 0] có trong I0
(3) Nếu [A α . Bβ ,0] là một thực thể trong I0 thì ta cho vào I0 tất cả các luật sinh trong P có dạng B γ các thực thể [B .γ ,0]
• Xây giờ chúng ta xây dựng Ij sau khi đã có I0, I1,… Ij-1
(4) Với mỗi thực thể trong Ij-1 có dạng [B α . aβ ,i] (với a=aj) cho tập thực thể [B α a . β ,i] vào trong Ij
Thực hiện bước (5) và (6) sau cho đến khi không còn tập thực thể mới được thêm vào :
(5) Nếu [A α . , i] là một thực thể trong Ij, kiểm tra xem trong tập Ii các thực thể có dạng [B α . Aβ , k] với mỗi tập thực thể tìm được như vậy ta cho vào Ij [B α A . β , k]
(6) Nếu [A α . Bβ, i] là một thực thể trong Ij, tìm trong P tất cả các luật sinh có dạng B γ ta thêm [B .γ , j] vào Ij
• Kết thúc giải thuật khi j=n
Như vậy : Từ ý tưởng của giải thuật trên để dễ nhớ và dễ trình bày về sau ta có thể đặt tên cho từng tác vụ trong giải thuậtï như sau :
(4) : Scan.
(5) : Complete.
(6) : Predict.
Và có thể mô tả sơ lượt giải thuật như sau, sau khi đã tạo được tập I0:
Giải thuật Earley chỉ dựa vào các thực thể trong tập trạng thái để quyết định tác vụ nào trong ba tác vụ nói trên sẽ thực hiện.
• Nếu trạng thái là trạng thái không kết thúc và ký hiệu sau dấu chấm là ký
hiệu không kết thúc thì ta thực hiện tác vụ predict trên trạng thái đó bằng cách : + Tìm trên tập văn phạm P các luật sinh có ký hiệu vế trái trùng với kí hiệu nằm bên phải dấu chấm của luật có dấu chấm đang xét sau đó thực hiện :
+ Thêm vào các thực thể mới vào cuối trạng thái Ii, mỗi trạng thái mới
gồm có :
- Luật sinh mà ta mới tìm được với dấu chấm nằm ở vị trí bắt đầu bên phải của luật sinh
- Con trỏ (pointer) được đặt hàng i (trạng thái mới này sẽ không được thêm vào tập trạng thái nếu nó đã có trong tập trạng thái)
• Nếu trạng thái là trạng thái không kết thúc, ký hiệu nằm sau dấu chấm là ký
hiệu kết thúc trùng với ký hiệu nhập đang xét thì ta thực hiện tác vụ Scan;
+ Scan đưa vào tập trạng thái Ii+1 một trạng thái giống với trạng thái cũ
nhưng dấu chấm trong luật tương ứng dịch qua phải một ký hiệu
• Nếu trạng thái là trạng thái kết thúc và chuỗi ký hiệu nhìn trước trùng với k
ký hiệu nhập bắt đầu từ vị trí i trong chuỗi nhập thì ta thực hiện tác vụ Complete:
+ Complete là tìm trong tập trạng thái If (với f là pointer của thực thể đang xét ) các thực thể có ký hiệu nằm bên phải của dấu chấm trùng với ký hiệu vế trái của thực thể có dấu chấm đang xét, thêm các thực thể mới tìm được
vào cuối trạng thái Ii với dấu chấm dịch qua phải một ký hiệu.
Ví dụ : Cho một văn phạm G với các luật sinh : (1) E T+E (2) E T (3) T F*T (4) T F (5) F (E) (6) F a Với chuỗi nhập : w = (a+a)*a
• Đầu tiên chúng ta xây dựng tập thực thể I0 : Cho vào I0 các thực thể [E .T+E , 0] (01)
[E .T, 0] (02)
- Xét (01) áp dụng luật (3) của giải thuật ta cho vào I0 các thực thể: [T .F*T, 0] (03)
[T .F , 0 ] (04)
- Xét (02) áp dụng luật (3) của giải thuật ta cũng có được hai thực thể (03) và (04) nhưng hai thực thể này đã tồn tại trong I0 rồi nên ta không thêm vào.
- Xéùt (03) áp dụng luật (3) của giải thuật ta thêm vào I0 các thực thể : [F . (E) , 0] (05)
[F . a , 0] (06)
- Xét (04) áp dụng luật (3) của giải thuật ta cũng có được hai thực thể (05) và (06) nhưng hai thực thể này đã tồn tại trong I0 rồi nên ta không thêm vào. Và bây giờ không có thực thể nào được thêm vào I0 nữa.
I0 [E .T+E , 0] (01) [E .T, 0] (02) [T .F*T, 0] (03) [T .F , 0 ] (04) [F . (E) , 0] (05) [F . a , 0] (06)
• Xây dựng I1 từ I0
- Vì a1 = ( nên ta theo luật (4) ta cho vào I1 thực thể [F (. E ) , 0] (11)
- Aùp dụng luật (6) trên luật (11) ta thêm vào I1 các thực thể sau : [E .T, 1] (12)
[T .F*T, 1] (13) [T .F , 1] (14) [F . (E) , 1] (15) [F . a , 1] (16)
- Bây giờ không còn thực thể nào được thêm vào nữa • Xây dựng I2 :
- Do a2 = a do đó theo luật (4) ta theo vào I2 [F a . , 1] (21)
- Aùp dụng luật (5) cho tập thực thể (21) ta thêm vào tập I2 các thực thể : [T F . *T , 1] (22)
[T F . , 1] (23)
- Aùp dụng luật (5) cho tập thực (23) vì trong I1 có thực thể .T do đó ta thêm vào I2 các luật :
[E T . +E , 1] (24) [E T . , 1] (25)
- Tương tự như trên ta thêm vào I2 luật sinh [F (E . ) , 0] (26)
Bây giờ không còn tập luật sinh nào được thêm vào I2 nữa. • Tương tự ta tính các thực thể I3, I4, ... I7 ta được kết quả :
I0 I1 I2 I3 I4 I5 Trang 35 [F (. E ) , 0] [E .T, 1] [T .F*T, 1] [T .F , 1] [F . (E) , 1] [F . a , 1] [F a ., 1] [T F . *T, 1] [T F ., 1] [E T . + E , 1] [E T. , 1] [F (E .) , 0] [E .T+E , 0] [E .T, 0] [T .F*T, 0] [T .F , 0 ] [F . (E) , 0] [F . a , 0] [E T + .E , 1] [E .T+E , 3] [E.T , 3] [T. F *T , 3] [T. F , 3] F .( E ), 3] [F a . , 3] [T F . *T , 3] [T F . , 3] [E T. + E, 3] [E T. , 3] [E T+ E ., 1] [F ( E ). . 0] [T F . *T , 0] [T F . , 0] [E T. + E, 0] [E T. , 0]
I6 I7