Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
2,07 MB
Nội dung
Chương 3 :Mô tả Cú pháp và ngữ nghĩa Nội dung • Giới thiệu • Phương pháp Mô tả Cú pháp Chính quy • thuộc tính ngữ pháp • Mô tả ngữ nghĩa động của chương trình 1. Giới thiệu Nếu Một ngôn ngữ không được mô tà rõ ràng có thể o Khó học o Khó thực hiện o Hiểu sai Hầu hết các ngôn ngữ lập trình mới đều được sự kiểm tra của các người dùng sẽ sử dụng ngôn ngữ sau khi nó được hoàn thành Những người cần phải hiểu rõ định nghĩa ngôn ngữ o Các nhà thiết kế ngôn ngữ thiết kế khác o Các nhà xây dựng trình biên dịch o Lập trình viên (những người sử dụng của ngôn ngữ) Nghiên cứu về ngôn ngữ lập trình có thể 2 phần o cú pháp :là dạng thức hay cú pháp của một biểu thức,một cấu trúc lệnh, một đơn thể chương trình o ngữ nghĩa (đối với máy tính):ý nghĩa của biểu thức,cấu trúc lệnh hay một đon thể chương trình Ngữ nghĩa đi theo cú pháp, cú pháp phải rõ ràng và phải có ý nghĩa cho biết cú pháp lệnh dùng làm gì và cách sử dụng Ví dụ cú pháp if trong C if (<expr>) <true-statement>; else <false-statement>; 2. Các thuật ngữ A sentence (Câu): là một chuổi các ký tự được định nghĩa trên bảng chử cái A language (Ngôn ngữ) :là tập hợp các câu A lexeme (Đơn thể) là cú pháp nhỏ nhất của chương trình ví dụ :*,+,-,sum,begin A token(Phân loại) phân loại các đơn thể ví dụ :identifier,number,operator Ví dụ : cho biểu thức index = 2 * count + 10; Lexeme(Đơn thể) Token (Loại) Index identifier (biến định nghĩa) = equal_sign (dấu =) 2 int_literal (giá trị số nguyên) * mult_op (dấu nhân) 1 Count identifier (Biến định nghĩa) + plus_op (Dấu cộng) 10 int_literal (giá trị số nguyên) ; semicolon (dấu chấm phẩy) 3. Định nghĩa Ngôn ngữ Ngôn ngữ có thể được định nghĩa bằng 2 cách riêng biệt :Nhận dạng và mô tả(Phát sinh) o Nhận dạng ngôn ngữ : Một thiết bị nhận dạng của ngôn ngữ nhận chuỗi đầu vào và nhận dạng chuỗi này có thuộc ngôn ngữ hay không(Auto mat hữu hạn(Ngôn ngữ chính quy),automat dẫy xuống(Ngôn ngữ phi ngữ cảnh) • Ví dụ: phân tích cú pháp của một trình biên dịch o Phát sinh ngôn ngữ Pháp sinh các câu của ngôn ngữ Kiểm tra cú pháp của ngôn ngữ o Nhận dạng ngôn ngữ :Giống “hộp đen” o Phát sinh ngôn ngữ :Giống “hộp mở”, mọi người có thể dể dàng đọc và tìm hiểu 4. Phương pháp hình thức Mô tả Cú pháp Các kỹ thuật dùng để biểu diển hình thức của ngôn ngữ gọi là văn phạm :có 2 dạng chính qui và phi ngữ cảnh Trong phần này Ta tìm hiểu về văn phạm phi ngữ cảnh(ngôn ngữ lập trình thuộc về lớp này) o Noam Chomsky :Nhà toán học đã định nghĩa 4 lớp ngôn ngữ (1950) o Hai trong nhóm này đó là ngôn ngữ chính qui(RGs) và văn phạm phi ngữ cảnh thường (CFGs)được dùng trong khoa học máy tính Token(loại) trong ngôn ngữ lập trình được mô tả bằng ngôn ngữ chính quy Hầu hết các ngôn ngữ lập trình đều được mô tả bằng văn phạm phi ngữ cảnh o Backus-Naur Form(BNF) : Được phát minh bởi John Backus để mô tả ngôn ngữ Algol 58 BNF : là một siêu ngôn ngữ(metalanguage ) dùng để mô tả các ngôn ngữ khác Cú pháp của BNF giống CFGs : cũng bao gồm tập các luật sinh,tập ký hiệu kết thúc, không kết thúc, ký hiệu bắt đầu) Ví dụ :mô tả địa chỉ bưu điện ở mỹ : <postal-addr> ::= <name-part> <street-addr> <zip-part> (M ột địa chỉ gồm 3 phần :Tên, địa chỉ và mã vùng) <name-part> ::= <personal-part> <name-part> | <personal-part> <last-name> <suffix-part> (Tên gồm 2 phần :phần riêng ,tên hoặc phần riêng, tên và xưng hô) <personal-part> ::= <first-name> | <initial> "." (Phần riêng :tên hoặc ký tự đầu ) <street-addr> ::= <house-num> <street-name> 2 (Địa chỉ :số nhà và tên đường) <zip-part> ::= <town-name> "," <state-code> <ZIP-code> (Zip-part :tên thành phố,state-code, zipcode <suffix-part> ::= "Sr." | "Jr." | <roman-numeral> Mặc dù BNF đơn giản, nhưng nó có thể mô tả phần lớn các cú pháp của ngôn ngữ lập trình: -Danh mục các cấu trúc tương tự Ví dụ :cú pháp khai báo biến trong C Kiểu dữ liệu TênBiến1,TênBiên2 …; Ta có thể định nghĩa mộ chuỗi vô hạn các biến => nhưng có thể dùng BNF hay CFGs để biểu diễn -Thứ tự trong các cấu trúc khác nhau phải xuất hiện Ví dụ if<ký hiệu không kết thúc> then <ký hiệu không kết thúc> -Cấu trúc lồng nhau đến độ sâu nào : Ví dụ :cấu trúc của biểu thức có thể dùng dấu() , các cấu trúc lệnh lồng nhau -độ ưu tiên của toán tử - tính kết hợp của toán tử 5. Ngữ pháp và luật Mặc dù BNF là đơn giản, nhưng nó có thể mô tả phần lớn các cú pháp của ngôn ngữ lập trình: - Danh sách của các cấu trúc tương tự(Đệ qui) Ví dụ : int a,b,c…(Vô hạn) - Trình tự, trong đó các cấu trúc khác nhau phải xuất hiện If(ký hiệu không kết thúc) then <Ký hiện không kết thúc> - Cấu trúc lồng nhau đến độ sâu nào (((a+b)*(c+d))*e); - Ưu Qên toán tử A+b*c: toán tử * ưu Qên hơn dấu + - Unh kết hợp toán tử A+b+c(Kết hợp trái, phải giống nhau) a-b-c(Unh từ trái # Unh từ phải) 3 1. Ngữ pháp và luật : Một luật sinh :có vế trái và vế phải,và có dạng Ký hiệu không kết thúc vế phải Ví dụ :<assign><var> = <expression> Một ký hiệu không kết thúc có thể cho nhiều giá trị Ví dụ :<if_stmt> if <logic_expr> then <stmt> | if <logic_expr> then <stmt> else <stmt> Một luật gọi là đệ quy : nếu ký hiệu không kết thúc xuất hiện ở vế phải của luật sinh =>mô tả 1 lượng không hạn định các biến Ví dụ : <ident_list> identifier | identifier ,<ident_list> Ví dụ cú pháp của một biểu thức • Bảy ký hiệu kết thúc: + - * / ( ) x y • Bốn ký hiệu không kết thúc : ‹expr› ‹term› ‹factor› ‹var› • Ký hiệu bắt đầu: ‹expr› • Bộ luật sinh ‹expr› ‹term› | ‹expr› + ‹term› | ‹expr› - ‹term› ‹term› ‹factor› | ‹term› * ‹factor› | ‹term› / ‹factor› ‹factor› ‹var› | ( ‹expr› ) ‹var› x | y 2. Dẫn xuất : là quá trình thay thế một ký hiệu không kết thúc bằng một ký hiệu kết thúc Có thể dùng phát sinh mọi dạng câu Một Quá trình dẫn xuất có thể tạo 1 dạng câu Một dạng câu chỉ bao gồm các ký hiệu kết thúc =>một câu Các dạng dẫn xuất : Dẫn xuất trái : ưu tiên mở rộng các ký tự không kết thúc ở bên trái nhất của vế phải Dẫn xuất phải : ưu tiên mở rộng các ký tự không kết thúc ở bên phải nhất của vế phải Dẫn xuất tùy ý Nếu văn phạm không nhọc nhằn :thứ tự dẫn xuất không quan trọng 3. Văn phạm phi ngữ cảnh : 4 Trong văn phạm phi ngữ cảnh có thể có những sự thay thế không nên xãy ra vì không có ngữ nghĩa Ví dụ cho tập luật sinh : <sentence><noun-phrase><verb-phrase> . <noun-phrase><article><noun> <article> a | the <noun> girl | dog <verb-phrase><verb><noun-phrase> <verb>sees | pets Xét dẫn xuất trái: <sentence><noun-phrase><verb-phrase> . <article><noun><verb-phrase> . the<noun><verb-phrase> . the girl <verb-phrase> . the girl <verb><noun-phrase> . the girl sees <noun-phrase> . the girl sees <article><noun> . the girl sees a <noun> . the girl sees a dog . =>đúng cú pháp nhưng ngữ nghĩa có thể sai Ví dụ dẫn xuất trái với biểu thức ( x - y ) * x + y Dùng bộ luật sinh • Bảy ký hiệu kết thúc: + - * / ( ) x y • Bốn ký hiệu không kết thúc : ‹expr› ‹term› ‹factor› ‹var› • Ký hiệu bắt đầu: ‹expr› • Bộ luật sinh ‹expr› ‹term› | ‹expr› + ‹term› | ‹expr› - ‹term› ‹term› ‹factor› | ‹term› * ‹factor› | ‹term› / ‹factor› ‹factor› ‹var› | ( ‹expr› ) ‹var› x | y ‹expr› ‹expr› + ‹term› ‹term› + ‹term› ‹term› * ‹factor› + ‹term› ‹factor› * ‹factor› + ‹term› ( ‹expr› ) * ‹factor› + ‹term› ( ‹expr› - ‹term› ) * ‹factor› + ‹term› ( ‹term› - ‹term› ) * ‹factor› + ‹term› ( ‹factor› - ‹term› ) * ‹factor› + ‹term› 5 ( ‹var› - ‹term› ) * ‹factor› + ‹term› ( x - ‹term› ) * ‹factor› + ‹term› ( x - ‹factor› ) * ‹factor› + ‹term› ( x - ‹var› ) * ‹factor› + ‹term› ( x - y ) * ‹factor› + ‹term› ( x - y ) * ‹var› + ‹term› ( x - y ) * x + ‹term› ( x - y ) * x + ‹factor› ( x - y ) * x + ‹var› ( x - y ) * x + y Ví dụ 2 : Cú pháp của một ngôn ngữ <program> begin <stmt_list> end :Một chương trình bắt đầu bằng begin và kết thúc là end <stmt_list><stmt> | <stmt> ;<stmt_list>:Câu lệnh có thể 1 lệnh hoặc nhiều lệnh, các lệnh kết thúc bằng ; nhưng lệnh cuối cùng không có ; <stmt><var> = <expression>: câu lệnh là một lệnh gán một biến bằng một biểu thức <var> A | B | C :biến chỉ có thể là A,B,C <expression><var> + <var> | <var> – <var> | <var>:biểu thức chỉ là biểu thức +,- nhưng chỉ có 2 toán tử hoặc một biến Cho biểu thức A = B + C ; B = C <program> begin<stmt_list> end begin<stmt> ; <stmt_list> end begin<var> = <expression> ; <stmt_list> end begin A = <expression> ; <stmt_list> end begin A = <var> + <var> ; <stmt_list> end begin A = B + <var> ; <stmt_list> end begin A = B + C ; <stmt_list> end begin A = B + C ; <stmt > end begin A = B + C ; <var> = <expression> end begin A = B + C ; B = <expression> end begin A = B + C ; B = <var> end begin A = B + C ; B = C end 4. Cây phân tích cú pháp : Mô tả cú pháp, nút cha là ký hiệu không kết thúc,nút lá là ký hiệu kết thúc Ví dụ : 6 Có nhiều cách phân rã như cho về một cây cú pháp Ví dụ cho phép sinh <assign><id> = <expr> <expr><expr> + <expr> | <expr> * <expr> | ( <expr> ) | <number> | <id> <number><number><digit> | <digit> <digit>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <id> A | B | C 7 Một biểu thức gọi là “nhọc nhằn” nếu nó có hai cây cú pháp Ví dụ : Độ ưu tiên toán tử :toán tử càng xa gốc độ ưu tiên càng cao Loại bỏ sự mơ hồ Cho luật sinh sau ; (đẩy *,( ra xa gốc :độ ưu tiên cao 8 Biểu thức A=B+C*A Tính kết hợp các toán tử : Toán tử +, * kết hợp trái hay phải là tương đương Toán tử -,/kết hợp trái khác kết hợp phải Nếu ký hiệu không kết thúc của vế trái xuất hiện ở phần trái nhất của vế phải =>dẫn xuất trái Nếu ký hiệu không kết thúc của vế trái xuất hiện ở phần phải nhất của vế phải =>dẫn xuất phải +,* :dẫn xuất trái ^(**) :dẫn xuất phải Cú pháp rõ ràng của lệnh If- then- else Cú pháp không rõ ràng <if_stmt>if <logic_expr> then<stmt> | If <logic_expr> then <stmt> else<stmt> Ví dụ sau thể hiện sự mơ hồ : if<logic_expr> then if<logic_expr> then <stmt> else <stmt> Cho ra hai cây phân tích cú pháp 9 Một luật cú pháp của lệnh mà hầu hết các ngôn ngữ điều dùng đó là lệnh else sẽ kết hợp với if gân nhất If <stmt><matched> | <unmatched> <matched> if <logic_expr> then<matched>else<matched> | Any non-ifstatement <unmatched> if <logic_expr> then <stmt> | if<logic_expr> then <matched> else <unmatched> 5. Cú pháp BFN mở rộng : Tăng cường tính dễ hiểu,dể viết, nhưng không được công nhận rộng rải Có 3 mở rộng [] tùy chọn, ví dụ : <selection> if (<expression>) <statement> [ else <statement> ]; | :chọn giữa các khả năng, ví dụ <for_stmt> for <var> := <expr> (to | downto) <expr> do <stmt> {} thể hiện tính lặp 0 hoặc nhiều lần, ví dụ BNF: <expr> <expr> + <term> | <expr> – <term> | 10 [...]... năng mô tả mọi cú pháp của ngôn ngữ lập trình Văn phạm thuộc tính:bổ sung thêm một số cú pháp mô tả ngữ nghĩa tĩnh của văn phạm Ví dụ :muốn sử dụng biến phải khai báo Int a,b a=b; c=d;//không pháp hiện trong văn phạm phi ngữ cảnh, nhưng có thể phát hiện trong văn phạm thuộc tính Văn phạm thuộc tính:dùng mô tả ngữ nghĩa tĩnh(trình biên dịch) 8 Các khái niệm cơ bản của văn phạm thuộc tính 11 Attributes(Thuộc... | /) } 6 Sơ đồ cú pháp : Các thông tin trong BNF và EBNF quy tắc có thể được biểu diển bằng một đồ thị có hướng Đồ thị như vậy làđược gọi là đồ thị cú pháp Các nút chữ nhật chứa tên của các ký hiệu không kết thúc Vòng tròn hoặc bầu dục chứa các ký hiệu kết thúc Ví dụ : 7 Văn phạm thuộc tính : Văn phạm phi ngữ cảnh :không đủ khả năng mô tả mọi cú pháp của ngôn ngữ lập trình Văn phạm... rổng Mỗi luật sinh đều có môt hàm ngữ nghĩa đi kèm để xác định giá trị của các thuộc tính đi kèm với ký hiệu không kết thúc Mỗi tập sinh đều có một hàm vị từ đi kèm để kiểm tra tính đúng sai của các thuộc tính Tập A(X) chia làm hai loại Thuộc tính tổng hợp(Synthesized attributes)S(X) :sẽ được sử dụng để truyền thông tin ngữ nghĩa từ dưới lên trong cây phân tích cú pháp Thuộc tính kế thừa(... văn phạm, giống như biến, có thể gán giá trị Semantic functions(Hàm ngữ nghĩa) :là các luật sinh, được dùng để xác định giá trị của các thuộc tính Predicate functions(Hàm vị từ) :dùng để xác định tính đúng, sai của luật ngữ nghĩa, liên kết với luật sinh 9 Định nghĩa văn phạm thuộc tính : Văn phạm thuộc tính là một văn phạm phi ngữ cảnh CFG G =(S,N,T,P) với những bổ sung : Với mỗi ký hiệu không... sử dụng, Tiến trình một là kế thừa và tiến trình hai là tổng hợp có thể hợp lại thành một tiến trình bằng cách sắp xếp topology (dùng đồ thị có hướng với mỗi đỉnh đầu là 1 thuộc tính f và đỉnh kết thúc là thuộc tính e mà để tính f phải có e và tạo một đồ thị có hướng không chu kỳ ) Ví dụ : Thuộc tính tổng hợp 16 1 Kiểu của biểu thức :được mô tả là những kiểu mà ngôn ngữ cung cấp 17 o o o o Các kiểu cơ... của biểu thức bên trái và bên phải luật sinh phải giống nhau Cho luật sinh : • = • + | • vA | B | C o Các thuộc tính dùng hai thuộc tính dể định nghĩa ngôn ngữ ngôn ngữ : actual_type: là thuộc tính tổng hợp từ and expected_type: là thuộc tính kế thừa từ -ta có : 14 Cho biểu thức : 15 • • • Phương pháp tính toán kiểu của... thông tin ngữ nghĩa từ trên xuống Văn phạm thuộc tính phải luôn có phân tích cú pháp Ví dụ : cho luật sinhX0 X1… Xn –Tính S(X0) = f(A(X1), A(Xn)) :S(X0) được tính từ A(X1) A(XN) :tính từ dưới lên :thuộc tính tổng hợp –I(Xj) = f(A(X0), , A(Xn)) :được tính từ A(X0) A(Xn) : tính từ trên xuống :thuộc tính kế thừa(thường n=j-1) -Giá trị của một thuộc tính thừa kế trên một nút phụ thuộc vào các giá... integer, real, void type name : là kiểu được định nghĩa : typedef int INTEGER kiểu của biểu thức cũng được hình thành bằng cách các toán tử Kiểu Mảng : Gọi T là một loại biểu thức xác định kiểu của mỗi phần tử của mảng, Các loại biểu thức kiểu mảng mô tả như sau:array (I, T) Ví dụ : var a: array [1 10] of Integer; Kiểu array(1 10, Integer) dùng định nghĩa biến a var b: array [1 5, 2 7] of Real; The... trên một nút phụ thuộc vào các giá trị các nút anhem và nút cha của nó -Thuộc tính intrinsic(sẳn có )trong bảng danh biểu ví dụ : Synthesized attributes(Tổng hợp-Từ dưới lên) 12 -Inherited attributes (Kế thừa-Từ trên xuống) Vídụ float a,b,c ;hệ thống sẽ hiểu a có kiểu float và b,c có kiểu của a 13 Hàm vị từ : o có dạng là một biểu thức luận lý dựa vào tập thuộc tính{A(X0),A(X1) A(Xn)), nếu trả về... name of the type expression: record(pointer(integer)Xarray(1 10,char)Xreal) Kiểu hàm được định nghĩa TD TR Ví dụ : function f(a, b: char): ^integer; TD là (char X char) TR là pointer(integer) Kiểu của hàm f: (char X char) pointer(integer) Overloading của hàm và toán tữ • Ví dụ • Toán tử * được định nghĩa Integer * integer->integer Ta có thể Overloading * như sau : function “*”(i, j: integer) return . Chương 3 :Mô tả Cú pháp và ngữ nghĩa Nội dung • Giới thiệu • Phương pháp Mô tả Cú pháp Chính quy • thuộc tính ngữ pháp • Mô tả ngữ nghĩa động của chương trình 1. Giới thiệu Nếu Một ngôn ngữ không. hay một đon thể chương trình Ngữ nghĩa đi theo cú pháp, cú pháp phải rõ ràng và phải có ý nghĩa cho biết cú pháp lệnh dùng làm gì và cách sử dụng Ví dụ cú pháp if trong C if (<expr>). ngôn ngữ Kiểm tra cú pháp của ngôn ngữ o Nhận dạng ngôn ngữ :Giống “hộp đen” o Phát sinh ngôn ngữ :Giống “hộp mở”, mọi người có thể dể dàng đọc và tìm hiểu 4. Phương pháp hình thức Mô tả Cú pháp