1. Trang chủ
  2. » Công Nghệ Thông Tin

Đề tài Cú pháp và ngữ nghĩa trong ngôn ngữ lập trình

18 889 4

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 257,43 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cú pháp: Những qui tắc mà chương trình có thể hiểu. Hình thức hoặc cấu trúc của biểu thức, câu lệnh và chương trình. Ngữ nghĩa: Ý nghĩa của các chương trình, bao gồm tất cả ý nghĩa. Theo sau cú pháp (Syntax), hình thức của câu lệnh phải rõ ràng, ngụ ý những gì câu lệnh thực hiện hoặc dùng như thế nào.

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

KHOA KHOA HỌC MÁY TÍNH

BÀI BÁO CÁO Môn: Nguyên lý và phương pháp lập trình

Đề tài: Cú pháp và ngữ nghĩa trong ngôn ngữ lập trình

Giảng viên: Ths.Trịnh Quốc Sơn

Nhóm sinh viên:

Lưu Vĩnh Phúc 14520695

TP Hồ Chí Minh 12/2016

Trang 2

M c L c ục Lục ục Lục

Lời cảm ơn 2

Nhận xét của giáo viên 3

I.CÚ PHÁP VÀ NGỮ NGHĨA 4

II NHỮNG PHƯƠNG THỨC MÔ TẢ CÚ PHÁP (Formal Methods of Describing Syntax) 6

2.1 Cú pháp trừu tượng ( Abstract syntax) 6

2.2 Cú pháp cụ thể (Concrete syntax) 8

Cây phân tích cú pháp (Parse Tree) 9

Sự mơ hồ (hay sự nhập nhằng) của văn phạm 11

III NGỮ NGHĨA 13 3.1 Ngữ nghĩa tác vụ(Operational Semantics) 15

Luật rút gọn cho biểu thức 16

3.2 Ngữ nghĩa biểu thị( Denotational semantics) 19

Ngôn ngữ số nhị phân 19

Ngôn ngữ lập trình đơn giản 20

Môi trường 22

3.3 Ngữ nghĩa tiên đề (Axiomatic semantics) 24

Hệ luật HOARE 25

IV.Demo cây phân tích cú pháp (Parse Tree) 27

Trang 3

Lời cảm ơn

Để có được sự thành công thì phải gắn liền với những sự hỗ trợ, giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp của thầy cô và bạn bè Trong suốt thời gian từ khi bắt đầu học tập ở trong học kỳ này, Khoa đã tổ chức cho chúng em được tiếp cận với môn học mà theo em là rất hữu ích đối với sinh viên ngành Khoa Học Máy Tính cũng như tất cả các sinh viên thuộc các chuyên ngành Khoa Học Kĩ Thuật khác Đó là môn học “Nguyên Lý và Phương pháp lập trình”.

Em xin chân thành cảm ơn thầy Ths.Trịnh Quốc Sơn và Ths Trần Nguyên Phong đã tận tâm hướng dẫn chúng em qua từng buổi học trên lớp cũng như những đóng góp ý kiến, thảo luận về đề tài

Em xin chân thành cảm ơn thầy.

TP Hồ Chí Minh 12/2016

(Nhóm sinh viên thực hiên)

Trang 4

Nhận xét của giáo viên

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

……….………

………

……….………

………

………

Trang 5

I CÚ PHÁP VÀ NGỮ NGHĨA

Ngôn ngữ lập trình là hệ thống gồm các ký kiệu và quy tắc kết hợp các ký hiệu thành các cấu trúc có ý nghĩa

Để có thể mô tả ngôn ngữ lập trình để máy tính có thể hiểu được nó chúng ta cần xác định hai phương thức sau:

Cú pháp:

o Những qui tắc mà chương trình có thể hiểu

o Hình thức hoặc cấu trúc của biểu thức, câu lệnh và chương trình

Ngữ nghĩa:

o Ý nghĩa của các chương trình, bao gồm tất cả ý nghĩa

o Theo sau cú pháp (Syntax), hình thức của câu lệnh phải rõ ràng, ngụ ý những gì câu lệnh thực hiện hoặc dùng như thế nào

Những người sử dụng định nghĩa ngôn ngữ:

Người thiết kế ngôn ngữ (Other language designers).

Người thực hiện (Implementers).

Lập trình viên (Programmers).

Chúng ta thật sự phải có một sự định nghĩa ngôn ngữ rõ ràng, bởi nếu không chúng ta thấy rằng một ngôn ngữ có lẽ khó học, khó thực hiện, và 1 số thì mơ hồ trong đặc điểm có thể dẫn đến những sự khác biệt

Ví dụ 1:

while(<Biểu thức,điều kiện> )

{

<Câu lệnh >

}

Ví dụ 2: Ta xét biểu thức sau:

Biểu thức 1=4

Biểu thức 2=1+1+2

Biểu thức 3=1+1+1+1

Cả 3 biểu thức trên đều có cùng giá trị, tức là giống nhau về mặt ngữ nghĩa tuy nhiên

chúng khác nhau về mặt cú pháp

Trang 6

Sự quan trọng của cú pháp:

– Cú pháp chính xác, rõ ràng là rất quan trọng Sai cú pháp là đồng nghĩa với việc, chương trình không thể chạy

– Trong một nghĩa nào đó, Cú pháp ít quan trọng, thì sửa cú pháp cho đến khi nào chương trình chạy đúng, và kết thúc

– Nhưng cú pháp của một ngôn ngữ có ảnh hưởng rất lớn:

o Làm thế nào để viết chương trình một cách dễ dàng

o Làm thế nào để đọc và hiểu chương trình dễ dàng

o Thật dễ để tạo ra những lỗi cú pháp khó hiểu

Cú pháp là đánh máy (Syntax is typographical)

– Cú pháp mô tả cách chúng ta viết chương trình như là một chuỗi ký tự

– Cú pháp có thể chính xác và chính thức được định nghĩa bởi BNF (Backus-Naur Form)

– Một ngôn ngữ theo nghĩa thông thường là một chuỗi các ký tự (hoặc âm thanh) và đòi hỏi cú pháp

Mô tả cú pháp (Describing Syntax)

– Sentence : Là chuỗi ký tự trong bảng chữ cái alphabet

– Language : Là tập hợp các câu

– Lexeme : Là cú pháp thấp nhất trong hệ thống lệnh(e.g.,*,+,=,sum,begin)

– Token : Là 1 loại của lexeme

II Những phương thức chính mô tả cú pháp (Formal Methods of Describing Syntax)

Cú pháp của một ngôn ngữ lập trình có thể được xác định một cách hình thức bằng cách sử dụng một hệ thống các ký hiệu khác, mà về thực chất cũng là một ngôn ngữ Ngôn ngữ dùng để xác định cú pháp hoặc ngữ nghĩa của một ngôn ngữ lập trình được

gọi là siêu ngôn ngữ (meta-language)

2.1 Cú pháp trừu tượng (Abstract syntax)

Cú pháp trừu tượng phân các yếu tố của ngôn ngữ lập trình ra thành các lớp

cú pháp (syntactic class).

Liệt kê tất cả các dạng (syntactic form) của mỗi lớp

Ưu điểm: Cú pháp trừu tượng là đơn giản, cho thấy một cái nhìn khái quát về cấu

trúc, cú pháp của ngôn ngữ

Nhược điểm: Không đề cập đến ký hiệu của ngôn ngữ mà nó mô tả, không thể xác

định chuoi ký hiệu có phải là một chương trình hợp lệ hay không

Trang 7

Ví dụ:

– Lớp cú pháp

C Hằng (constant)

O Toán tử(operator)

E Biểu thức (expression)

– Dạng cú pháp

E ::= C | E O E | ( E )

2.2 Cú pháp cụ thể (concrete syntax)

Cú pháp cụ thể khắc phục được các nhược điểm của cú pháp trừu tượng.Nó cho phép xác định cấu trúc kết hợp của chuỗi ký hiệu và cho biết chuỗi ký hiệu đó có hợp lệ hay không

Văn phạm phi ngữ cảnh( Context Free Grammars)

 Được phát triển bởi Noam Chomsky giữa thập niên 1950

 Language generators : miêu tả cú pháp của ngôn ngữ tự nhiên

CFG là một văn phạm hình thức mà trong đó các luật là ở dạng V → w.

Ðể xác định cú pháp của một ngôn ngữ, người ta dùng văn phạm phi ngữ cảnh

CFG (Context Free Grammar) hay còn gọi là văn phạm BNF (Backers Naur Form)

Văn phạm phi ngữ cảnh (CFG) là một hệ thống gồm bốn thành phần, ký hiệu là văn

phạm G (V, T, P, S), trong đó:

-T: Một tập hợp các token các ký hiệu kết thúc (terminal symbols).

Ví dụ: Các từ khóa, các chuỗi, dấu ngoặc đơn…

-V: Một tập hợp các ký hiệu chưa kết thúc (nonterminal symbols), còn gọi là các

biến (variables)

-P: Một tập hợp các luật sinh (productions) trong đó mỗi luật sinh bao gồm một ký

hiệu chưa kết thúc - gọi là vế trái, một mũi tên và một chuỗi các token và / hoặc các

ký hiệu chưa kết thúc gọi là vế phải

- S Một trong các ký hiệu chưa kết thúc được dùng làm ký hiệu bắt đầu của văn

phạm (start symbol).

BNF - Backus Normal Form (1959) là một siêu ngôn ngữ phổ biến để xay dựng cú

pháp cụ thể:

 Được tạo ra bởi John Backus để miêu tả cho Algol 58

 NF tương đương với CFG (context-free grammars)

Metalanguage là một dạng ngôn ngữ dùng để miêu tả cho một ngôn ngữ khác

Trang 8

Ví dụ: Văn phạm G ({S, A, B}, {a, b}, P, S ), trong đó P gồm các luật sinh sau:

S →A

A →aA

A →a

→b

→b

Cây phân tích cú pháp (Parse Tree)

– Để dễ hình dung sự phát sinh ra các chuỗi trong văn phạm phi ngữ cảnh, ta thường diễn tả một chuỗi dẫn xuất qua hình ảnh một cây (cây phân tích cú pháp)

– Cây phân tích cú pháp có thể được xem nhưmột dạng biểu diễn hình ảnh của một dẫn xuất Ta nói rằng αAβ dẫn xuất ra αγβ (ký hiệu: αAβ Aβ dẫn xuất ra αAβ dẫn xuất ra αγβ (ký hiệu: αAβ γβ (ký hiệu: αAβ dẫn xuất ra αγβ (ký hiệu: αAβ Aβ ⇒ αAβ dẫn xuất ra αγβ (ký hiệu: αAβ γβ) nếu A → γ là một luật sinh, αAβ dẫn xuất ra αγβ (ký hiệu: αAβ và β là các chuỗi tùy ý các ký hiệu văn phạm

– Nếu αAβ dẫn xuất ra αγβ (ký hiệu: αAβ 1 ⇒ αAβ dẫn xuất ra αγβ (ký hiệu: αAβ 2 ⇒ ⇒ ta nói αAβ dẫn xuất ra αγβ (ký hiệu: αAβ 1 dẫn xuất ra (suy ra)

Định nghĩa: Cho văn phạm G (V, T, P, S) hay cây phân tích cú pháp

i) Mỗi nút (đỉnh) có một nhãn, là một ký hiệu ∈(V ∪T ∪{ε}).})

ii) Nút gốc có nhãn là ký hiệu bắt đầu S

iii) Nếu nút trung gian có nhãn A thì A ∈V

iv) Nếu nút n có nhãn A và các đỉnh n1, n2, , nk là con của n theo thứ tự từ trái

sang phải có nhãn lần lượt là X1, X2, , Xkthì A →X1X2 Xk là một luật sinh trong tập luật sinh P

v) Nếu nút n có nhãn là từrỗng ε}).thì n phải là nút lá và là nút con duy nhất của nút

cha của nó

Ví dụ: Xây dựng cây phân tích cú pháp:

Trang 9

III NGỮ NGHĨA

Ngữ nghĩa:

– Nghĩa của biểu thức, câu lệnh, chương trình, ý nghĩa của cấu trúc trong một ngôn ngữ, và ý nghĩa của chương trình được viết bởi ngôn ngữ đó

– Ngữ nghĩa là cơ sở cho mọi thứ, bạn làm trong ngôn ngữ

– Cú pháp chỉ là dòng “lệnh” để mô tả ngữ nghĩa

– Xác định nghĩa của 1 ngôn ngữ lập trình khó hơn nhiều so với nghĩa của cú pháp – Ngữ nghĩa có thể coi như một chức năng mà bản đồ cấu trúc cú pháp

(maps syntactical) cho mô hình tính toán

Ngữ nghĩa mức độ thấp (Low level semantics)

Ngữ nghĩa có thể ảnh hưởng tới mức rất thấp:

Ví dụ:

Java: do{x=2*x;} while (x<100);

Pascal: repeat x:=2*x until x>=100;

Nhận xét: Nhận thấy ý nghĩa của 2 dòng lệnh khác nhau.

Java : Thoát khỏi vòng lặp khi điều kiện sai, Pascal: thì ngược lại với Java

Ngữ nghĩa mức độ cao (High-level semantics)

Ngữ nghĩa có thể ảnh hưởng tới mức rất cao:

– C là 1 ngôn ngữ thủ tục; mô tả 1 tập hợp thủ tục

– Java là 1 ngôn ngữ hướng đối tượng; mô tả các đối tượng và trạng thái của

chúng

– Prolog là 1 ngôn ngữ logic; mô tả các sự việc và mối quan hệ logic giữa chúng

Cú pháp hỗ trợ ngữ nghĩa

– Một ngôn ngữ không thể có ngữ nghĩa mà không có cú pháp để hỗ trợ ngữ nghĩa

 C: không thể có vòng lặp for mà không có cú pháp

 Java: không thể có các đối tượng mà không có cú pháp cho việc tạo ra và sử dụng chúng

Điều này không có nghĩa là vòng lặp for và các đối tượng là cấu trúc cú pháp!

Trang 10

 Những lợi thế của định nghĩa chính thức: rõ ràng điều mà các chương trình có thể chứng minh là đúng và máy dịch xác nhận để thành 1 hành vi chính thức

 Định nghĩa chính thức đối với ngữ nghĩa không được đáp ứng hoàn toàn

 Nhiều phương pháp tiếp cận được đẩy và nhiều người không hiểu rõ và không sử dụng phổ biến

Điều thú vị là ngữ nghĩa chính là thường sau khi thực tế một ngôn ngữ hoặc có thể không áp dụng cho toàn bộ ngôn ngữ (Trường hợp về HTML và SGML)

Để định nghĩa của một ngôn ngữ lập trình rõ ràng và chính xác, ngữ nghĩa của ngôn ngữ lập trình cũng cần được mô tả một cách hình thức Ngữ nghĩa hình thức không chỉ là

cơ sở cho việc chứng minh tính đúng đắn của chương trình, mà còn có ích trong quá trình thiết kế và thực hiện ngôn ngữ lập trình

3.1 Ngữ nghĩa tác vụ (Operational Semantics):

– Ý tưởng: đặc tả ý nghĩa một chương trình khi thực thi từng câu lệnh trên máy tính (máy thật hoặc mô phỏng)

– Sự thay đổi trạng thái của máy tính cho ta ý nghĩa của câu lệnh

– Dựa vào một máy ảo mà tập các tác vụ của nó đã được định nghĩa chính xác

– Ngữ nghĩa của mỗi phần tử chương trình được đặc tả bằng 1 tập các tác vụ của máy ảo

– Phần cứng (hardware) chương trình dịch thuần túy cần tạo ra rất cao

– Phần mềm(software) chương trình dịch thuần túy cũng có vấn đề:

o Các đặc điểm chi tiết của máy tính sẽ làm hành động khó hiểu

o Một định nghĩa ngữ nghĩa sẽ phụ thuộc vào máy

– Lựa chọn tốt hơn: Mô phỏng máy tính hoàn chỉnh

– Quá trình:

o Xây dựng một máy dịch (dịch mã nguồn tới mã máy của 1 máy tính

lý tưởng)

o Xây dựng một giả lập cho máy lý tưởng

Bộ lưu trữ Điều khiển

Chương trình

Trang 11

Đánh tả ngữ nghĩa tác vụ cho phép:

o Chứng minh tính đúng đắn của chương trình

o Kiểm tra tính đúng đắn của chương trình dịch

3.2 Ngữ nghĩa biểu thị( Denotational semantics):

Ngữ nghĩa biểu thị được dựa trên lý thuyết hàm đệ qui, là phương pháp mô tả ngữ nghĩa trừu tượng nhất và được phát triển bởi Scott và Strachey (1970)

Ngữ nghĩa của mỗi cấu trúc cú pháp được đặc tả bằng một ánh xạ, gọi là hàm ngữ nghĩa (semantic function) từ miền cú pháp (syntactic domain) sang miền ngữ nghĩa(semantic domain) để biểu thị ngữ nghĩa.

Trước khi xem cách mô tả hình thức ngữ nghĩa của môt ngôn ngữ lập trình bằng ngữ nghĩa biểu thị ta xét ngôn ngữ số nhị phân

Ngôn ngữ số nhị phân

Ngôn ngữ số nhị phân là các số nhị phân Gồm 2 kí hiệu “0” và “1” Ngữ nghĩa

của số nhị phân chính là giá trị thập phân của số đó

Bảng ngôn ngữ số nhị

phân

Cú pháp trừu tượng

B ∈ Bml Số nhị

phân B → 0 | 1 | B0 |

B1

Miền ngữ nghĩa: N là tập các số nguyên

Hàm ngữ nghĩa: N: Bml → N

N [[0]] = 0

N [[1]] = 1

N [[B0]] = 2 * N [[B]]

N [[B1]] = 2 * N [[B]] + 1

Trang 12

Ví dụ: theo định nghĩa trên thì ngữ nghĩa của số nhị phân 101 là:

N [[101]] = 2* N [[10]] +1=2*2* N [[1]]+1 = 2*2*1+1=5

Ngôn ngữ lập trình đơn giản

Để đơn giản hóa vấn đề ta chỉ xét một ngôn ngữ lập trình tương đối đơn giản Ngôn ngữ này gồm hai hằng “0” và “1”, các dấu ngoặc tròn

Hai phép toán:

 Một toán hạng là : ‘-’ và ‘not’

 Hai toán hạng là : ‘+’ và ‘=’

Các lệnh của ngôn ngữ gồm lệnh rỗng (null), lệnh gán, các cấu trúc điều khiển cơ bản (tuần tự, điều kiện và lặp) và lệnh gọi thủ tục (call) Thủ tục được định nghĩa bằng

lệnh gán thân thủ tục vào các tập thủ tục Tất cả các danh hiệu trong chương trình đều là toàn cục Chương trình có một danh hiệu nhập- xuất Dữ liệu nhập của chương trình là trị khởi động cho danh hiệu nhập-xuất sau khi thực hiện xong chương trình là dữ liệu xuất của chương trình

Ví dụ: chương trình của ngôn ngữ lập trình đơn giản :

Với dữ liệu nhập là một số bất kỳ, dữ liệu ra cũng chính là số đó Dữ liệu nhập luận lý sẽ gây ra lỗi cho chương trình

Denotation Semantics với Operational Semantics:

– Trong ngữ nghĩa tác vụ: Sự thay đổi được xác định bởi lệnh thuật toán (coded

algorithms)

– Trong ngữ nghĩa biểu thị: Sự thay đổi được xác định bởi chức năng toán học chặt

chẽ

Đánh giá ngữ nghĩa biểu thị:

– Dùng để chứng minh tính đúng đắn của chương trình

– Cung cấp về những suy nghĩ chặt chẽ của chương trình

– Trợ giúp để thiết kế ngôn ngữ

– Được sử dụng trong các hệ thống trình biên dịch

– Vì sự phức tạp của nó, Nên ít được sử dụng cho người sử dụng ngôn ngữ

Program (x);

Begin

y:=x;

p:=(procedure x:=x+1)

if x=y then x:=x+(-1) else x:=0;

call p

end

Trang 13

3.3 Ngữ nghĩa tiên đề (Axiomatic semantics):

Ngữ nghĩa của phát biểu:

Ý nghĩa của chương trình được xác định bởi tập hợp các quy tắc làm thay đổi dữ liệu sau khi thực hiện một phép toán nào đó của ngôn ngữ lập trinh

- Ngữ nghĩa tiêu đề dùng dề chứng minh một số tính chất của chương trình.

- Ngữ nghĩa của phát biểu S được đặc tả bởi công thức sau: {P} S {Q}

Trong đó:

– P là điều kiện về trị của các biến trước khi thực thi S, gọi là tiền điều kiện

(precondition) của S

– Q là điều kiện về vị trí các biến sau khi thực thi S, gọi là hậu điều kiện

(Postcondition) của S

– S là phát biểu.

Diễn dịch đặc tả trên là nếu P đúng thì sau khi S thực hiện xong ta có Q đúng.

Nếu với hậu điều kiện bất kỳ của S, ta biết được những tiền điều kiện sao cho khi S được

thực hiện xong hậu điều kiện trên được thỏa mãn, thì ta biết được ngữ nghĩa của S

Điều kiện P2 gọi là yếu hơn P1 nếu P1=> P2 Tiền điều kiện ở đặc tả của phát biểu

càng yếu, ngữ nghĩa của phát biểu càng rõ

Ví dụ:

{ y > 0 } x := 1 / y { x = 1 / y}

y>0⇒y≠0

Với hậu điều kiện Q của S, chúng ta ký hiệu ϖp(S,Q) Trong đó: Q là biến số, có thể xem là ngữ nghĩa chính xác của S

Ví dụ:

wp(x := 1 / y, x = 1 / y) ≡ y ≠ 0

wp(n := n + 1, n > 0) ≡ n ≥ 0

Trang 14

Ví dụ:

a = b + 1 {a > 1}

Một tiền điều kiện có thể: {b > 10}

Tiền điều kiện yếu: {b > 0}

Hệ luật HOARE

Hệ luật Hoare gồm các tiên đề và luật suy dẫn về ngữ nghĩa của phát biểu theo đặc

tả vừa trình bày trên

Các kí hiệu “^, ¬,^,v ” được sử dụng trong hệ luật lần lượt tương ứng với các toán

tử luận lý NOT,AND và OR Kí hiệu “=” được sử dụng làm ký hiệu định nghĩa, để phân biệt với các toán tử luận lý “=”

Luật 1: Nếu ({P} S {Q}) (Q

R) thì {P} S {R}

Luật 2: Nếu ({P} S {Q}) (R

P) thì {R} S {Q}

Luật 3: (Tiên đề về phép gán)

{Px→E} x:= E {P},

với E là biểu thức và Px→E là P trong đó x được thay bằng E

Ví dụ: chứng minh {f = i!} i := i + 1 {f * i = i!}

P ↔ f * i = i!E↔i+1

Pi→E ↔ f *(i+1) = (i+1)!

Theo L3: {f *(i+1) = (i+1)!} i := i + 1 {f * i = i!}

Vì f = i! ⇒ f *(i+1) = (i+1)! nên theo L2 ta có điều cần chứng minh

Luật 4: (Luật về phát biểu ghép)

Nếu ({P} S1 {Q}) ∧ ({Q} S2 {R})

thì {P} S1; S2 {R}

Ví dụ: Chứng minh {f =i!} i := i + 1; f := f * i {f = i!}

Ngày đăng: 09/01/2017, 11:30

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w