PHÂN TÍCH cú PHÁP (CHƯƠNG TRÌNH DỊCH SLIDE)

61 119 0
PHÂN TÍCH cú PHÁP (CHƯƠNG TRÌNH DỊCH SLIDE)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

CHƯƠNG III PHÂN TÍCH CÚ PHÁP Phân tích cú pháp Mục tiêu: -Nắm vai trò giai đoạn phân tích cú pháp - Văn phạm phi ngữ cảnh (context- free grammar),cách phân tích cú pháp từ lên- từ xuống (top-down and bottom-up parsing) -Bộ phân tích cú pháp LR Vai trị phân tích cú pháp • Đây giai đoạn thứ trình biên dịch • Nhiệm vụ chính: Nhận chuỗi token từ phân tích từ vựng xác định chuỗi có sinh văn phạm Token không ngôn Lexical ngữ nguồn Source Parser Rest of Parse program analyzer Get next token tree front end Symbol table • Các phương pháp phân tích cú pháp (PTCP) chia làm hai loại: Phân tích từ xuống (top- down parsing) phân tích từ lên (bottom- up parsing) • Trong q trình biên dịch xuất nhiều lỗi giai đoạn PTCP phân tích cú pháp phải phát thơng báo lỗi xác cho người lập trình đồng thơi khơng làm chậm chương trình viết Văn phạm phi ngữ cảnh • Để định nghĩa cấu trúc ngơn ngữ lập trình ta dùng văn phạm phi ngữ cảnh (Context-free grammars) hay gọi tắt văn phạm • Một văn phạm bao gồm: - Các kí hiệu kết thúc (terminals): Chính token - Các kí hiệu chưa kết thúc (nonterminals): Là biến kí hiệu tập xâu kí tự - Các luật sinh (productions): Xác định cách thức hình thành xâu từ kí hiệu kết thúc chưa kết thúc - Một kí tự bắt đầu (start symbol) Ví dụ 3.1: Văn phạm sau định nghĩa biểu thức số học đơn giản E  E A E | (E) | -E | id A+|-|*|/| Trong E, A kí tự chưa kết thúc (E cịn kí tự bắt đầu), kí tự cịn lại kí tự kết thúc • Dẫn xuất (derivation): Ta nói A   A   luật sinh ( đọc dẫn xuất suy ra) • Nếu 1  2   n ta nói 1 dẫn xuất n • Kí hiệu: * dẫn xuất 0 bước, + dẫn xuất 1 bước • Cho văn phạm G với kí tự bắt đầu S, L(G) ngôn ngữ sinh G Mọi xâu L(G) chứa kí hiệu kết thúc G • Ta nói xâu wL(G) S + w, w gọi câu (sentence) văn phạm G • Một ngôn ngữ sinh văn phạm phi ngữ cảnh gọi ngôn ngữ phi ngữ cảnh (context- free language) • Hai văn phạm gọi tương đương sinh ngơn ngữ • Nếu S *  ( chứa kí hiệu chưa kết thúc) thí ta nói  dạng câu (sentence form) G Một câu dạng câu không chứa kí hiệu chưa kết thúc Ví dụ 3.2: Xâu –(id+id) câu văn phạm ví dụ 3.1 E  -E  -(E)  -(E+E) -(id+E)  (id+id) • Một dẫn xuất gọi trái (leftmost) bước kí hiệu chưa kết thúc ngồi bên trái thay thế, kí hiệu lm Nếu S *lm   gọi dạng câu trái • Tương tự ta có dẫn xuất phải (rightmost) hay gọi dẫn xuất tắc, kí hiệu rm • Cây phân tích cú pháp (parse tree) dạng biểu diễn hình học dẫn xuất Ví dụ parse tree cho biểu thức – (id+id) là: E E ( E ) E | id + E | id 10 Ví dụ 3.12: Giả sử I = {E'  E., E  E + T} Ta có I' = { E  E + T} goto (I, +)  = closure(I') bao gồm mục : E  E + T                       T  T * F                        T  F                              F  (E)                           F  id 47 • Giải thuật xây dựng họ tập hợp mục LR(0) (kí hiệu C) văn phạm G' procedure Item (G') begin C := {closure({ S'  S}) }; repeat For Với tập mục I C ký hiệu phạm X cho goto (I, X) văn goto(I, X) C thêm goto(I, X) vào C; until  Khơng cịn tập hợp mục thêm vào C; end;   48 Ví dụ 3.13: Xây dựng họ tập hợp mục ví dụ 3.11 closure({E'  E}) I0: goto (I0, E)    I1 :   goto (I0, T)    I 2:   goto (I0,F)    I3:  goto (I0, ( )    I4 : E'  · E E ·E+T E ·T T ·T*F T ·F F  · (E) F  · id E'  E · EE·+T ET· TT·*F TF· F  (· E) E·E+T E·T T  · T *  F T·F F  · (E) goto (I0, id)   I5 : goto (I1, +)    I6: goto (I2, *)    I7: goto (I4, E)    I8 : goto (I6,T)     I9:   goto (I7,F)    F  id · EE+·T T·T*F T·F F  · (E) F  · id T  T* · F F  · (E) F  · id F  (E ·) EE·+T E E + T · TT·*F TT*F· F  (E) · 49 • Xây dựng SLR parsing table Xây dựng họ tập hợp mục G': C = { I0, I1, , In } Trạng thái i xây dựng từ  Ii Các action tương ứng trạng thái i xác định sau: a) Nếu A  .aIi goto (Ii, a) = Ij action[i, a] = "shift j", a ký hiệu kết thúc b) Nếu A   Ii action[i, a] = "reduce (A  )", với a FOLLOW(A), A  S' c) Nếu S'  S · Ii action[i, $] = "accept" Nếu action đụng độ sinh luật trên, ta nói văn phạm khơng phải SLR(1) Giải thuật thất bại Nếu goto (Ii,A)=Ij goto [i, A] = j, A kí hiệu chưa kết thúc Các ô không xác định “error” Trạng thái khởi đầu phân tích cú pháp xây dựng từ tập mục chứa S’  · S 50 Xây dựng bảng phân tích LR tắc • LR tắc (canonical LR) kĩ thuật chung để xây dựng LR parsing table cho văn phạm • Một mục LR(1) (item) cặp [A  ., a] A   luật sinh, a- kí tự lookahead kí hiệu kết thúc $ • Nếu  a khơng có ý nghĩa = việc reduce theo luật A   thực kí tự đọc vào a 51 • Phép tốn bao đóng (Closure): Giả sử I tập mục LR(1) văn phạm G bao đóng closure(I) tập mục xây dựng từ  I sau:  Tất mục I thêm vào closure(I) Nếu [A  .B, a] closure(I), B   luật sinh b  FIRST(a) thêm [B  , b] vào closure(I) chưa có Lặp lại bước thêm vào closure(I) • Phép tốn goto: Nếu I tập mục X ký hiệu văn phạm goto(I, X) bao đóng tập hợp mục  [A  X., a] cho [A  .X, a] I 52 • Giải thuật xây dựng họ tập hợp mục LR(1) (kí hiệu C) văn phạm G' procedure Item (G') begin C := {closure({[ S'  S, $]})}; repeat For Với tập mục I C ký hiệu phạm X cho goto (I, X) văn goto(I, X) C thêm goto(I, X) vào C; until  Khơng cịn tập hợp mục thêm vào C; end;   53 Ví dụ 3.14: Xây dựng họ tập hợp mục LR(1) cho văn phạm closure({S'  S}) I0: goto (I0, S)    I1 :   goto (I0, C)    I2:  S'  S (1)    S  CC (2)    C  cC (3) C  d S'  · S, $ S  · CC, $ C  · cC, c/d C  · d, c/d S'  S ·, $ S  C ·C, $ C  · cC, $ C  · d, $ goto (I0, d )    I4 : goto (I2, C)   I5 : goto (I2, c)    I6: C  c ·C, c/d goto (I2, d)    C  · cC, I7: C  d ·, c/d S  CC ·, $ C  c · C, $ C  · cC, $ C  · d, $ C  d ·, $ C  cC ·, c/d C  cC ·, $ 54 • Xây dựng canonical LR parsing table Xây dựng họ tập hợp mục LR(1) G': C = {I0, I1, , In } Trạng thái i xây dựng từ  Ii Các action tương ứng trạng thái i xác định sau: a) Nếu [A  .a, b]Ii goto (Ii, a) = Ij action[i, a] = "shift j", a ký hiệu kết thúc b) Nếu [A  ., a] Ii action[i, a] = "reduce (A  .)", AS' c) Nếu [S'  S ·, $] Ii action[i, $] = "accept" Nếu action đụng độ sinh luật trên, ta nói văn phạm LR(1) Giải thuật thất bại Nếu goto (Ii,A)=Ij goto [i, A] = j, A kí hiệu chưa kết thúc Các không xác định “error” Trạng thái khởi đầu phân tích cú pháp xây dựng từ tập mục chứa [S’  · S, $] 55 • Canonical LR parsing table cho văn phạm ví dụ 3.14 State Action c d s3 s4 Goto $ S C acc s6 s7 s3 s4 r3 r3 r1 s6 s7 r3 r2 r2 r2             56 Xây dựng bảng phân tích LALR • LALR phương pháp canonical parsing trạng thái nhóm lại với nhờ bảng phân tich cấu trúc có kích thước nhỏ (có thể so sánh với SLR) • Hạt nhân (core) tập hợp mục LR(1) có dạng {[A ., a]}, A  luật sinh a ký hiệu kết thúc có hạt nhân (core) tập hợp {A .} • Trong họ tập hợp mục LR(1) C = {I0, I1, , In} có tập hợp mục có chung hạt nhân 57 • Xây dựng LALR parsing table Xây dựng họ tập hợp mục LR(1) G': C = {I0, I1, , In } Nhóm mục có core C C' = {J0, J1, , Jm } Trạng thái i xây dựng từ  Ji Các action tương ứng trạng thái i xác định tương tự canonical LR Nếu action đụng độ sinh luật trên, ta nói văn phạm LALR(1) Giải thuật thất bại Xây dựng bảng goto : Giả sử J = I1 I2   Ik Vì I1, I2, Ik có chung hạt nhân nên goto (I1,X), goto (I2,X), , goto (Ik,X) có chung hạt nhân Ðặt K hợp tất tập hợp có chung hạt nhân với goto (I1,X) goto(J, X) =K 58 • LALR parsing table cho văn phạm ví dụ 3.14 State Action c d s36 s47 Goto $ S C acc s36 s47 36 s36 s47 89 47 r3 r3 89 r3 r1 r2 r2 r2 59 Cơng cụ phân tích cú pháp Yacc • Giống Lex, Yacc (yet another compiler compiler) câu lệnh sẵn có UNIX công cụ hữu hiệu cho phép xây dựng phân tích cú pháp cách tự động • Yacc tạo S C Johnson vào năm đầu thập kỉ 70 • Yacc sử dụng phương pháp LALR 60 Yacc specification translate.y y.tab.c input Yacc compiler C compiler a.out y.tab.c a.out output 61 ... lỗi (error) 29 Phân tích cú pháp từ lên • Giới thiệu kiểu phân tích cú pháp từ Giới thiệu kiểu phân tích cú pháp từ lên tổng quát gọi phân tích cú pháp Shift –Reduce • Một phương pháp tổng quát... phương pháp phân tích cú pháp (PTCP) chia làm hai loại: Phân tích từ xuống (top- down parsing) phân tích từ lên (bottom- up parsing) • Trong q trình biên dịch xuất nhiều lỗi giai đoạn PTCP phân tích. . .Phân tích cú pháp Mục tiêu: -Nắm vai trị giai đoạn phân tích cú pháp - Văn phạm phi ngữ cảnh (context- free grammar),cách phân tích cú pháp từ lên- từ xuống (top-down

Ngày đăng: 29/03/2021, 07:21

Mục lục

    CHƯƠNG III PHÂN TÍCH CÚ PHÁP

    Phân tích cú pháp

    Vai trò của bộ phân tích cú pháp

    Văn phạm phi ngữ cảnh

    Phân tích cú pháp từ trên xuống

    Phân tích cú pháp từ dưới lên

    Phân tích cú pháp LR (LR parser)

    Xây dựng SLR parsing table

    Xây dựng bảng phân tích LR chính tắc

    Xây dựng bảng phân tích LALR

Tài liệu cùng người dùng

Tài liệu liên quan