Slide Chương trình dịch (UNIT9) - GV Nguyễn Thị Thu Hương

LI
lienhejb
0 lượt tải
5
0

Nội dung tài liệu

Trang 1

21/1/2010 Đặc điểm của phương pháp Bài 9. „ Sử dụng để phân tích cú pháp cho các Phương pháp đệ quy văn phạm LL(1) trên xuốống „„ Có thCó thểể mmởở rrộộngng cho vcho văănn phphạạm LL(k)m LL(k), nhưng việc tính toán phức tạp „ Sử dụng để phân tích văn phạm khác có thể dẫn đến lặp vô hạn Bộ phân tích cú pháp Mô tả chức năng „ Bao gồm một tập thủ tục, mỗi thủ tục ứng „ Giả sử mỗi thủ tục hướng tới một đích với một sơ đồ cú pháp (một ký hiệu không ứng với một sơ đồ cú pháp kết thúc) „„ TTạại mi mỗỗi thi thờờii đđiiểểm luôn có mm luôn có mộộtt đđíchích đượđượcc „ Các thủ tục đệ quy : khi triểển khai một ký triển khai, kiểm tra cú pháp hết một đoạn hiệu không kết thúc có thể gặp các ký hiệu không kết thúc khác, dẫn đến các thủ tục nào đó trong văn bản nguồn gọi lẫn nhau, và có thể gọi trực tiếp hoặc gián tiếp đến chính nó. goupee.com fb.com/groups/goupee 1

Trang 2

21/1/2010 Thủ tục triển khai một đích Từ sơ đồ thành thủ tục „ Đối chiếu văn bản nguồn với một đường trên sơ đồ cú „ Mỗi nút trên sơ đồ ứng với một thủ tục pháp „ Các nút xuất hiện tuần tự chuyển thành các câu lệnh kế „ Đọc từ tố tiếp tiếp nhau. „ Đối chiếu với nút tiếpp theo trên sơ đồ „ Các điểm rẽ nhánh chuyyển thành câu lệệnh lựựa chọọn (( ,if, „ Nếu là nút tròn (ký hiệu kết thúc)thì từ tố vừa đọc phải case) phù hợp với từ tố trong nút „ Chu trình chuyển thành câu lệnh lặp (while, do while, „ Nếu là nút chữ nhật nhãn A (ký hiệu không kết thúc), từ repeat. . .) tố vừa đọc phải thuộc FIRST (A) => tiếp tục triển khai „ Nút tròn chuyển thành đoạn đối chiếu từ tố đích A „ Nút chữ nhật chuyển thành lời gọi tới thủ tục khác „ Ngược lại, thông báo một lỗi cú pháp tại điểm đang xét Chú ý Bộ phân tích cú pháp KPL „ void error (const char msg[]); „ Bộ phân tích cú pháp luôn đọc trước một „ int accept(symbol s); // kiểm tra s có phải là symbol từ tố không? „ int expect(symbol s); // kiểm tra s có phải là symbol cần „„ Xem trXem trướước mc mộột tt từừ ttốố chocho phép chphép chọọnn đđúngúng đọc không? đường đi khi gặp điểm rẽ nhánh trên sơ „ void factor(void);//phân tích nhân tử „ void term(void);//phân tích số hạng đồ cú pháp „ void expression(void); // phân tích biểu thức Khi thoát khỏi thủ tục triển khai một đích, „ void condition(void); // phân tích điều kiện „ void statement(void); // phân tích câu lệnh „ có một từ tố đã được đọc dôi ra „ void block(void); // phân tích các khối câu lệnh „ void basictype(void); // các kiểu biến cơ bản „ void program(); goupee.com fb.com/groups/goupee 2

Trang 3

21/1/2010 Hàm accept Hàm expect int accept(symbol s) int expect(symbol s) { { if (sym == s) {{ if(accept(s))if(accept(s)) getsym(); return 1; return 1; error("expect: unexpected symbol"); } return 0; return 0; } } void factor(void){if(accept(ident){} Phân tích void term(void) Phân tích else factor { term if(accept(number)) {} else if(accept(lparen)) factor(); { expression(); while(sym == times || sym == slash) expect(rparen); { } else getsym(); { error("f("facttor: synttax error")"); factor(); getsym(); } } } } goupee.com fb.com/groups/goupee 3

Trang 4

21/1/2010 void expression(void) Phân tích void condition(void) Phân tích { expression { condition if(sym == plus || sym == minus) expression(); getsym(); if(sym == eql || sym == neq || sym == lss || sym == leq || sym == grt || sym == geq) term(); { while(sym == plus || sym == minus) getsym(); { expression();expression(); getsym(); } else term(); { } error("condition: syntax error"); } } } Sơ đồ cú pháp của lệnh Phân tích statement KPL void statement(void) expect(rparen); { } else if(accept(beginsym)) if(accept(ident)) { { statement(); while(sym == semicolon) expect(becomes); { expression(); getsym(); statement(); // variable := } } expect(endsym); } else if(accept(callsym)) else if(accept(ifsym)) { { condition(); expect(ident); expect(thensym); expect(lparen); statement(); if (accept(elsesym)) expression();expression(); statement();statement(); while (sym == comma) } else if(accept(whilesym)) { { getsym(); condition(); expect(dosym); expression(); statement(); } } else if (accept(forsym)) { expect(ident); expect(becomes); expression(); expect(tosym); expression(); expect(dosym); statement(); } else { getsym(); } } goupee.com fb.com/groups/goupee 4

Trang 5

21/1/2010 void basictype() Phân tích void program() Phân tích basic type { program { expect(programsym); if(accept(integersym)){} expect(ident); expect(semicolon); else block(); if(sym == period) expect(charsym);expect(charsym); {{ } printf("No error!"); return; } else { error("Syntax error."); } } Phân tích block void block(void) if(accept(varsym)) Khối { { while (accept(ident)) if(accept(constsym)) // const { { expect(colon); while (accept(ident)) type(); expect(semicolon); { } expect(eql); } constant_decl(); while(sym == procsym) { expect(semicolon); getsym(); }} expect(idt(ident)t); } if (accept(lparen)) if (accept(typesym)) // type { paramlist(); { expect(rparen); while (accept(ident)) } { expect(semicolon); block(); expect(eql); expect(semicolon); type(); } expect(semicolon); expect(beginsym); } statement(); while(accept(semicolon)) } statement(); expect(endsym); } goupee.com fb.com/groups/goupee 5

Hiển thị 5 trang đầu. Tải tài liệu để xem đầy đủ.

Bình luận (0)

Đăng nhập để tham gia bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!