Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 137 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
137
Dung lượng
2,38 MB
Nội dung
IT4073:NGÔN NGỮ PHƯƠNG PHÁP DỊCH Phạm Đăng Hải haipd@soict.hut.edu.vn Chương 3: Phân tích cú pháp Bài tốn phân tích cú pháp Phương pháp phân tích cú pháp quay lui Phương pháp phân tích bảng Phương pháp phân tích cú pháp tất định Phân tích cú pháp cho PL/0 02/24/14 Bài toán phân tích cú pháp Bài tốn đặt Cho – Văn phạm phi ngữ cảnh G Trong chương trình dịch, xâu ω chuỗi token thu từ giai đoạn Program Vidu; trước – phân tích từ vựng G = (VT, VN, P, S) – Xâu ω V*T Hỏi – ω∈ L(G)? Begin X := 10 Nếu ω ∈ L(G) End PROGRAM IDENT SEMICOLON BEGIN IDENT ASSIGN NUMBER END PERIOD – Chỉ sản xuất sử dụng để sinh ω – Cấu trúc nên suy dẫn 02/24/14 Bài tốn phân tích cú pháp Phương pháp phân tích • Kiểm tra xâu phân tích từ trái qua phải – Kiểm tra ký hiệu trái xâu cần phân tích – Tới ký hiệu tiếp, Cho tới ký hiệu cuối • Phương pháp xây dựng phân tích – Trên xuống (Top-down): S ⇒ * ω? – Dưới lên (Bottom-up): ω *⇐ S? • Phương pháp lựa chọn sản xuất (A→α1|…|αn) – Quay lui (backtracking) • Thử sản xuất – Tất định (deterministic) 02/24/14 • Xác định sản xuất thích hợp Bài tốn phân tích cú pháp Phân tích trái • Phân tích trái xâu α dãy sản xuất sử dụng suy dẫn trái từ S α • Các sản xuất đánh số thứ tự 1, p – Phân tích danh sách số từ đến p • Ví dụ cho văn phạm E → T+E E → T T → F* T T → F F → (E) F → a 02/24/14 Xét xâu a*(a+a) E ⇒2 T ⇒3 F*T ⇒6 a*T ⇒4 a*F ⇒5a*(E) ⇒1 a*(T+E) ⇒4 a*(F+E) ⇒6 a*(a+E) ⇒2 a*(a+T) ⇒4 a*(a+F) ⇒6 a*(a+a) Phân tích trái xâu a*(a+a) 23645146246 Chương 3: Phân tích cú pháp Bài tốn phân tích cú pháp Phương pháp phân tích cú pháp quay lui Phương pháp phân tích bảng Phương pháp phân tích cú pháp tất định Phân tích cú pháp cho PL/0 02/24/14 Phương pháp phân tích quay lui Giới thiệu • Tư tưởng chủ yếu giải thuật – Xây dựng phân tích cú pháp (cây suy dẫn) cho xâu ω • Thuật tốn Top-down – Đi từ nút gốc tới nút • Thuật tốn Bottom –up – Q trình phân tích gạt thu gọn 02/24/14 Phương pháp phân tích quay lui Phân tích Top-down Cho VPPNC G = (VT, VN, P, S) ∀ sản xuất A→α1|…|αn đánh số 1, 2, Xây dựng phân tích cho xâu ω: Khởi tạo - Xây dựng có nút gốc S - S (Start symbol): Ký hiệu khởi đầu - Gọi ký hiệu cần phân tích ký hiệu xâu ω - Gọi S nút hoạt động, 02/24/14 Phương pháp phân tích quay lui Phân tích Top-down Tạo nút (một cách đệ quy) Nút hoạt động ký hiệu không kết thúc A – Chọn sản xuất A chưa áp dụng: A →X1X2 .Xk (k ≥0) – Tạo k trực tiếp A với nhãn X1, X2, Xk – Nếu k > 0, Lấy X1 làm nút hoạt động – Nếu k = 0, (sản xuất A → ε), lấy nút bên phải (ngay sau) A nút hoạt động Tiếp tục thực bước 02/24/14 Phương pháp phân tích quay lui Phân tích Top-down Tạo nút (một cách đệ quy) Nút hoạt động ký hiệu kết thúc a - So sánh a với ký hiệu cần phân tích – Nếu trùng • Nút hoạt động nút bên phải a • Ký hiệu cần phân tích ký hiệu xâu vào – Nếu không trùng • Quay lại bước sử dụng sản xuất thử sản xuất tiếp – Nếu hết khả năng, quay lại bước trước 02/24/14 10 Phương pháp phân tích tất định Phân tích Bottom-Up • Văn phạm LL(k) • Văn phạm LL(1) • Phân tích xem trước • Phân tích đệ quy xuống 02/24/14 123 Chương 3: Phân tích cú pháp Giới thiệu Phương pháp phân tích cú pháp quay lui Phương pháp phân tích bảng Phương pháp phân tích cú pháp tất định Xây dựng phân tích cú pháp cho PL/0 02/24/14 124 Phương pháp phân tích tất định Nguyên tắc • Văn phạm PL/0 LL(1) – Sử dụng phương pháp phân tích xem trước • Bảng phân tích lớn – Dùng phương pháp đệ quy xuống • Bộ phân tích cú pháp – Gồm tập thủ tục, thủ tục ứng với sơ đồ – Luôn đọc trước ký hiệu/từ tố • Xem trước từ tố cho phép chọn đường gặp điểm rẽ nhánh sơ đồ cú pháp – Khi thoát khỏi thủ tục triển khai đích, ln có từ tố đọc dơi 02/24/14 125 Phương pháp phân tích tất định Các thủ tục • Token * getToken() //phân tích từ vựng • void error (const char msg[]);//Báo lỗi • void factor(void);//phân tích nhân tử • void term(void);//phân tích số hạng • void expression(void); // phân tích biểu thức • void condition(void); // phân tích điều kiện • void statement(void); // phân tích câu lệnh • void block(void); // phân tích khối câu lệnh • void basictype(void); // kiểu biến • void program(); 02/24/14 //Phân tích chương trình 126 Phương pháp phân tích tất định Term void term() { factor(); while(Token == times || Token == slash) { getToken(); factor(); } } 02/24/14 127 Phương pháp phân tích tất định Term (Thực hành KPL) ::= := Times := Slash void Term(){ Factor(); Term2(); } 02/24/14 FOLLOW( := ε void Term2(){ switch(Token){ case Times: Eat(Times); Factor(); Term2(); break; case Slash:… case KW_TO : case KW_DO : …………… case KW_END : break; Default: Error(Invalid Term) } 128 Phương pháp phân tích tất định Expression void expression() { if(Token== plus || Token == minus) getToken(); term(); while(Token == plus || Token == minus){ getToken(); term(); } } 02/24/14 129 Phương pháp phân tích tất định Expression (Thực hành KPL) ::= Plus ::= Minus ::= ::= ::=Plus ::=Minus ::= ε void compileExpression2() { compileTerm(); compileExpression3(); } 02/24/14 void compileExpression() { switch (Token) { case SB_PLUS: eat(SB_PLUS); Expression2(); break; case SB_MINUS: eat(Minus); Expression2(); break; default: Expression2(); } } 130 Phương pháp phân tích tất định Expression (Thực hành KPL) void compileExpression3() { switch (Token) { case Plus: eat(Plus); compileTerm(); compileExpression3(); break; case Minus: eat(Minus); compileTerm(); compileExpression3(); break; 02/24/14 // check the FOLLOW set case KW_TO: case KW_DO: case SB_RPAR: case SB_COMMA: case SB_EQ: case SB_NEQ: case SB_LE: case SB_LT: case SB_GE: case SB_GT: case SB_RSEL: case SB_SEMICOLON: case KW_END: case KW_ELSE: case KW_THEN: break; default: Error(Lỗi biểu thức); } }//compileExpression() 131 Phương pháp phân tích tất định Condition void condition() { expression(); if(Token == eql || Token == neq || Token == lss || Token == leq || Token == grt || Token == geq){ getsym(); expression(); }else { error("condition: syntax error"); } } 02/24/14 132 Phương pháp phân tích tất định Statement 02/24/14 133 Phương pháp phân tích tất định Statement void statement() { if(Token==Ident){ //variable := getToken(); //array variable ? if(Token==assign){ getToken(); Expresion(); }else Error(“Thieu toan tu gan”) } else… } 02/24/14 134 Phương pháp phân tích tất định Statement if (Token == KW_CALL){ getToken(); if(Token == Ident){ if(Token == Lparen){ getToken(); Expression(); while(Token==comma){ getToken(); Expression(); } if(Token = Rparen) getToken() else Error(“Thiếu dấu đóng ngoặc); } }else Error(“Thiếu tên thủ tục/hàm”); }else 02/24/14 135 Phương pháp phân tích tất định Statement if (Token == KW_BEGIN){ getToken() Statement(); while (Token == Semicolon) { getToken(); Statement(); } if(Token==KW_END) getToken() else Error(“Thiếu từ khóa End”); }else 02/24/14 136 Phương pháp phân tích tất định Program void Program(){ if(Token=KW_PROGRAM){ getToken(); if (Token==Ident){ getToken(); if(Token==Semicolon){ getToken(); Block(); if(Token==Period) printf(“Thành công”); else Error(“Thiếu dấu ”); }else Error(“Thiếu dấu chấm phẩy”); }else Error(“Thiếu tên chương trình”); }else Error(Thiếu từ khóa Program) } 02/24/14 137 .. .Chương 3: Phân tích cú pháp Bài tốn phân tích cú pháp Phương pháp phân tích cú pháp quay lui Phương pháp phân tích bảng Phương pháp phân tích cú pháp tất định Phân tích cú pháp cho PL/0... a*(a+a) Phân tích trái xâu a*(a+a) 23645146246 Chương 3: Phân tích cú pháp Bài tốn phân tích cú pháp Phương pháp phân tích cú pháp quay lui Phương pháp phân tích bảng Phương pháp phân tích cú pháp. .. 02/24/14 33 Chương 3: Phân tích cú pháp Giới thiệu Phương pháp phân tích cú pháp quay lui Phương pháp phân tích bảng Phương pháp phân tích cú pháp tất định Xây dựng phân tích cú pháp cho PL/0