Sự khác biệt giữa cú pháp và ngữ pháp là gì?


14

Tôi hiểu sự khác biệt giữa cú pháp và ngữ nghĩa -

Cú pháp : cách các ký hiệu được kết hợp để tạo thành một biểu thức hoặc câu lệnh hợp lệ.
Ngữ nghĩa : ý nghĩa của những biểu tượng tạo thành một biểu thức hoặc tuyên bố.

Nhưng ngữ pháp là gì? Ví dụ: đôi khi tôi nghe mọi người nói rằng một số cấu trúc là "sai về mặt ngữ pháp nhưng về mặt cú pháp thì nó đúng". Nó có nghĩa là gì?


FWIW, điều này nghe có vẻ vô nghĩa với tôi. Nếu ngữ pháp của ngôn ngữ chấp nhận đoạn mã, nó phù hợp với cú pháp. Có lẽ ai đó có định nghĩa "cú pháp" rất rộng (và không chuẩn). Bối cảnh / nguồn?

@del Nam. Không đúng. Ví dụ int;, có giá trị về mặt ngữ pháp, nhưng về mặt cú pháp được hình thành trong C ++. Ngữ pháp không có vấn đề với mã này, nhưng các ràng buộc cú pháp yêu cầu tên được cung cấp nếu phần đầu tiên của khai báo không chứa trình xác định lớp hoặc trình xác định enum hoặc, trong C ++ 11, trình xác định bạn bè .
Julian Schaub - litb

@ JohannesSchaub-litb: Bạn muốn trích dẫn một phần ngữ pháp làm cho điều này hợp lệ?

@Johanes Đó là mặt trái của tình huống trong câu hỏi.
Nicole

2
@ Johannes Schaub: Quy tắc nào tạo ra "int;" có hiệu lực? Ngữ pháp xác định cú pháp.
Casey Patton

Câu trả lời:


6

Một ngữ pháp là một tập hợp các quy tắc xác định cú pháp cho một ngôn ngữ cụ thể.

Khi mọi người đang nói cụ thể về trình phân tích cú pháp (đặc biệt là trình tạo được tạo bằng trình tạo trình phân tích cú pháp như yacc, Byacc, ANTLR, v.v.), họ có thể chia tóc nhiều hơn và nói cụ thể về các quy tắc cú pháp được mã hóa bằng cách sử dụng trình tạo quy tắc, so với những phần được thi hành riêng biệt bằng mã gắn liền với quy tắc. Ví dụ, trong C khi bạn xác định một mảng, kích thước bạn chỉ định cho mảng phải hoàn toàn dương (không phải bằng 0). Các quy tắc ngữ pháp về cơ bản có thể nói một cái gì đó như:

typename var_name '[' unsigned_int ']'

... Và sau đó riêng biệt, sẽ có một chút mã để kiểm tra xem unsign_int có khác không. Trong trường hợp này, có thể có ý nghĩa khi nói về các yêu cầu của cú pháp và ngữ pháp tách biệt với nhau, với hai yêu cầu hơi khác nhau (điều đó, được thi hành cùng nhau, chúng tôi cho rằng phù hợp với yêu cầu của chính ngôn ngữ).


3

Sự khác biệt là mờ nhạt và không đáng lo ngại về quá nhiều.

Mọi người đôi khi sẽ bao gồm các ràng buộc nhạy cảm theo ngữ cảnh dưới sự chính xác của cú pháp. Ví dụ phổ biến nhất là một hệ thống loại. Một cái khác là quy tắc "không có câu trả lời sau khi trả về" của Java. Điều này đơn giản hóa thảo luận chính thức: cú pháp mang lại một ngôn ngữ (một tập hợp các câu / biểu thức / chương trình) là miền của ngữ nghĩa; bất cứ điều gì khác là "không phải là một chương trình", và ngữ nghĩa không cần phải bận tâm với nó.

Ngược lại, "ngữ pháp" thường đề cập đến một phương pháp mô tả các ngôn ngữ không ngữ cảnh (ngữ pháp thuộc tính mặc dù).

Lý do không đáng lo ngại lắm là các hệ thống loại thường được coi là " ngữ nghĩa tĩnh " của ngôn ngữ vì chúng là " kỷ luật cú pháp cho tính chính xác". Và đôi khi một ngôn ngữ không hoàn toàn có ngữ pháp phù hợp với ngữ cảnh; C, ví dụ, phải cung cấp thông tin từ trình phân tích cú pháp trở lại từ vựng.

Về mặt thực tế, bất cứ ai dựa vào sự phân biệt giữa "cú pháp" và "ngữ pháp" đều nói tốt hơn và giải thích ý nghĩa của chúng.


Tôi không hiểu tại sao sự khác biệt là mờ nhạt. Ngữ pháp mô tả cú pháp.
Casey Patton

1
@Casey, không, theo một cách sử dụng từ "cú pháp", ngữ pháp chỉ định một siêu từ của cú pháp.
Ryan Culpepper

0

Một ngữ pháp là một tập hợp các quy tắc để xác định một ngôn ngữ. Thay vào đó, ngữ pháp mô tả cú pháp và ngữ nghĩa . Một ngôn ngữ có thể có hai ngữ pháp khác nhau:

  • Ngữ pháp cú pháp (một bộ quy tắc mô tả thứ tự các ký hiệu trong ngôn ngữ)
  • Ngữ pháp ngữ nghĩa (một bộ quy tắc mô tả vị trí ngữ nghĩa hợp lệ và việc sử dụng các ký hiệu đó)

Ví dụ, một phần ngữ pháp trong C có thể trông giống như:

if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...

Ý nghĩa:

an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....

Hãy xem cách xác định ngữ pháp này . Nếu bạn thực sự tò mò về ngữ pháp, hãy xem GNU Bison , về cơ bản là một công cụ để mô tả ngữ pháp của ngôn ngữ.

"Ngữ pháp không chính xác nhưng đúng về mặt cú pháp" không có ý nghĩa quá nhiều. Có lẽ họ đang đề cập đến một ngữ pháp mô tả ngữ nghĩa của ngôn ngữ. Nó chắc chắn sẽ có ý nghĩa hơn khi chỉ nói "không đúng về mặt ngữ nghĩa".


7
Không, ngữ pháp không định nghĩa ngữ nghĩa và không bao giờ nên làm điều đó, trừ khi đó là một thứ gì đó kỳ lạ, như bối cảnhfreeart.org
SK-logic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.