Thí duï: Chuùng ta coù aùp duïng giaûi thuaät 4.1 vaøo vaên phaïm sau ñeå loaïi boû ñeä quy traùi.. S→ Aa⏐ b A → Ac⏐ Sd ⏐∈ Thöøa soá traùi: Thí duï ta coù hai luaät sinh:.[r]
(1)CHƯƠNG PHÂN TÍCH CÚ PHÁP 4.1 Vai trò phân tích cú pháp
- Phương pháp tổng quát: Cocke-Younger-Kasami Earley - Phân tích từ xuống
- Phân tích từ lên
4.2 Xây dựng văn phạm cho ngôn ngữ lập trình Loại bỏ khơng tường minh
stmt → if exp then stmt
if exp then stmt else stmt | other
Thí dụ: phát biểu: if E1 then if E2 then S1 else S2 phát biểu không tường minh
- Loại bỏ không tường minh Quy ứơc sửa văn phạm
(2)matched-stmt→ if exp then matched-stmt else matched-stmt1 | other
unmatched-stmt → if exp then stmt
| if exp then matched-stmt else unmatched-stmt Loại bỏ đệ quay trái
Văn phạm gọi đệ quy trái tồn dẫn xuất A ⇒ Aα, với α ⊂ ( Vt ∪ Vn)
Đệ quy trái bao gồm đệ quy trái đơn giản (trực tiếp) đệ quy trái tổng quát
Để loại bỏ đệ quy đơn giản, ta thay thếõ tập luật sinh: A → Aα1⏐Aα2⏐ …… ⏐Aαm⏐β1⏐β2⏐… ⏐βn
baèng cặp luật sinh
A→ β1A’⏐β2A’⏐…⏐βnA.’
A’→α1A’⏐α2A’⏐ … ⏐αmA’⏐∈
Thí dụ 4.1. Loại bỏ đệ quy trái cho văn phạm: E → E + T ⏐ T
(3)Giải thuật 4.1. Loại bỏ đệ qy trái
Nhập: Văn phạm G khơng có vịng lặp hội luật sinh rỗng Xuất : Văn phạm tương đương G’ khơng có đệ quy trái
Phương pháp: Áp dụng giải thuật mô 4.1 cho G G’ khơng cịn đệ quy trái có luật sinh rỗng
Sắp xếp caucus ký hiệu không kết thúc theo thứ tự đó: A1, A2, … An
Mô 4.1. Giải thuật loại bỏ đệ quy trái từ văn phạm for i := to n
for j := to i - begin
- Thay luật sinh có dạng Ai → Ajγ luật sinh Ai→ δ1γ⏐δ2γ⏐… ⏐δkγ
- Với Aj luật sinh có dạng Ai → δ1⏐δ2⏐ ….⏐δk
- Loại luật sinh có đệ quy trái trực tiếp Ai luật sinh
(4)Thí dụ: Chúng ta có áp dụng giải thuật 4.1 vào văn phạm sau để loại bỏ đệ quy trái
S→ Aa⏐ b A → Ac⏐ Sd ⏐∈ Thừa số trái: Thí dụ ta có hai luật sinh:
stmt → if exp then stmt else stmt ⏐if exp then stmt
Cả hai luật sinh có if dẫn đầu nên ta chọn luật sinh để triển khai Vì để làm chậm lại định lựa chọn tạo thừa số trái
Giải thuật 4.2. Tạo văn phạm có thừa số trái Nhập: cho văn phạm G
Xuất: văn phạm G’ có thừa số trái tương đương
Phương pháp: Tìm chuỗi dẫn đầu chung vế phải luật sinh, thí dụ: A → αβ1⏐αβ2⏐… ⏐αβn⏐γ γ chuỗi không bắt đầu α Ta thay luật luật A→αA’ A’→ β1⏐β2⏐…⏐βn
Thí du: ï Ta áp dụng giải thuật cho văn phạm phát biểu if, nước văn phạm tương đương
(5)4.3 Phân tích cú pháp từ xuống Phân tích cú pháp đệ quy xuống Phân tích cú pháp đốn nhận trứơc
1 Phân tích cú pháp đệ quy xuống
Thí dụ: Cho văn phạm G : S→ cAd A → ab ⏐ a
S S
c A d c A d
a b)
a b
a)
(6)2 Phân tích cú pháp đoán nhận trước
- Hãy loại bỏ đệ quy trái cho văn phạm mà thiết kế - Hãy tạo văn phạm có thừa số trái cần thiết
Sơ đồ dịch cho phân tích đốn nhận trước Sơ đồ có đặc điểm sau:
- Mỗi ký hiệu khơng kết thúc có sơ đồ
- Tên cạnh token ký hiệu không kết thúc
Sự truyền token thực ký hiệu nhập trùng với token Nếu có truyền ký hiệu khơng kết thúc A ta thực lệnh gọi thủ tục A
Để xây dựng sơ đồ tiến hành bước sau đây: Tạo trạng thái bắt đầu kết thúc
2 Với luật sinh có dạng A Ỉ X1X2…Xn , ta xây dựng đường từ
(7)Cơ chế hoạt động phân tích đốn nhận trước
Thí dụ 4.3 Chúng ta tạo sơ đồ dịch cho văn phạm G: E Ỉ TE’
E’ Ỉ + TE’ |∈
T Ỉ FT’
T’ Ỉ ∗ FT’ |∈
F’ Ỉ (E) | id
T E’
+ T E’
E:
T: F T’
T’: F’ T’
∈ ∗
Hình 4.5 Sơ đồ dịch ký hiệu không kết thúc G
E’: ∈
4
3
0
7
10 11 12
8
( ∈ )
F: id
1
(8))
( E
Hình 4.6 Sơ đồ dịch ký hiệu không kết thúc G, được thu giảm
Giải thuật:
procedure E; procedure T;
procedure F;
begin nextchar (c); if c = ‘(‘ then begin
match (‘(‘); E; match (‘)‘); end
else if c = id then match (id) else error;
E: F:
id
6 17
0 14 15 16
+
T: 10
∗
13
(9)end; {F} begin
F;
while c = ‘*‘ do F;
end; {T} begin
T;
while c = ‘+‘ do T;
end; {E}
3 Phân tích cú pháp đốn nhận trước không đệ quy
(10)Stack a1a2 … an $ bộ đệm nhập
X Chương trình điều khiển
Y Z $
Bảng phân tích M
Xuaát