Các câu trả lời trên cho một định nghĩa khá tốt về nó là gì. Hãy xem liệu tôi có thể đặt nó bằng từ ngữ của mình không, để bạn có 23 lời giải thích thay vì 20. Toàn bộ mục đích của một ngữ pháp, bất kỳ ngữ pháp nào, là tìm hiểu xem một câu cụ thể có phải là một câu trong ngôn ngữ đã cho không. Tuy nhiên, những gì chúng tôi thực sự sử dụng ngữ pháp và phân tích cú pháp là để tìm ra ý nghĩa của câu. Nó giống như sơ đồ cũ của một câu bạn có thể hoặc không thể học lại trong lớp tiếng Anh ở trường. Một câu được tạo thành từ một phần chủ ngữ và một phần vị ngữ, một phần chủ đề có một danh từ và có thể một số tính từ, một phần vị ngữ có một động từ và có lẽ là một danh từ đối tượng, với một số tính từ, v.v.
Nếu có một ngữ pháp cho tiếng Anh (và tôi không nghĩ là có, không phải theo nghĩa khoa học máy tính) thì nó sẽ có các quy tắc của hình thức sau đây, được gọi là sản phẩm.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
Vân vân...
Sau đó, bạn có thể viết một chương trình và đưa cho nó bất kỳ câu nào, và chương trình có thể sử dụng ngữ pháp để tìm ra phần nào của câu mỗi từ và mối quan hệ giữa chúng với nhau.
Nếu trong mỗi sản xuất, chỉ có một điều ở phía bên trái, thì điều đó có nghĩa là bất cứ khi nào bạn nhìn thấy phía bên phải trong câu, bạn được phép thay thế ở phía bên trái. Chẳng hạn, bất cứ khi nào bạn thấy danh từ tính từ, bạn có thể nói "Đó là một Chủ đề" mà không cần chú ý đến bất cứ điều gì bên ngoài cụm từ đó.
Tuy nhiên, tiếng Anh (ngay cả mô tả đơn giản về tiếng Anh tôi đã nêu ở trên) rất nhạy cảm với ngữ cảnh. "Danh từ tính từ" không phải lúc nào cũng là một Chủ đề, nó có thể là một Danh từ trong một Dự đoán. Nó phụ thuộc vào ngữ cảnh. Hãy mở rộng ngữ pháp giả tiếng Anh của chúng tôi một chút:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Bạn chỉ có thể biến "danh từ tính từ" thành ObjectNounPhrase nếu nó xuất hiện ngay sau VerbPhrase.
Về cơ bản, nếu bạn có một sản phẩm và bạn có thể áp dụng nó bất cứ lúc nào bạn muốn, bất kể điều gì xung quanh nó, nó không có ngữ cảnh.
Bạn luôn có thể biết nếu một ngữ pháp là ngữ cảnh miễn phí dễ dàng. Chỉ cần kiểm tra nếu có nhiều hơn một biểu tượng ở bên trái của mũi tên.
Bất kỳ ngôn ngữ có thể được mô tả bởi nhiều hơn một ngữ pháp. Nếu một số ngữ pháp cho một ngôn ngữ là không có ngữ cảnh, thì ngôn ngữ đó là ngữ cảnh miễn phí. Nó có thể được chứng minh cho một số ngôn ngữ rằng không có ngữ pháp không ngữ cảnh có thể. Tôi cho rằng có thể có một ngữ pháp không ngữ cảnh cho tập hợp giả tiếng Anh đơn giản mà tôi đang mô tả ở trên.
Về lý do tại sao nó quan trọng, nó đòi hỏi một loại chương trình đơn giản hơn để phân tích ngữ pháp không ngữ cảnh. Như đã lưu ý trong các câu trả lời khác, nó không đòi hỏi toàn bộ sức mạnh của máy Turing để phân tích ngữ pháp không ngữ cảnh. Một trình phân tích cú pháp lookahead LR (1) (là một loại máy đẩy xuống) cho một ngữ pháp không ngữ cảnh cụ thể có thể phân tích bất kỳ câu nào trong ngữ pháp đó theo thời gian và không gian tuyến tính theo độ dài của câu. Nếu câu trong ngôn ngữ, trình phân tích cú pháp sẽ tạo ra một cây cấu trúc xác định ý nghĩa của từng biểu tượng trong câu (hoặc ít nhất là phần nào nó đóng trong cấu trúc). Nếu câu không có trong ngữ pháp, trình phân tích cú pháp sẽ chú ý và dừng lại ở ký hiệu đầu tiên không thể đối chiếu với ngữ pháp và các ký hiệu trước (trên "lỗi" đầu tiên).
Điều tuyệt vời hơn nữa là có những chương trình mà bạn có thể đưa ra một mô tả về ngữ pháp và một danh sách các hướng dẫn về những việc cần làm với mỗi phần (theo nghĩa là gắn "ý nghĩa" cho mỗi sản phẩm) và chương trình sẽ viết trình phân tích cú pháp cho bạn. Chương trình sẽ phân tích cú pháp câu, tìm cấu trúc và chạy hướng dẫn của bạn trên từng phần của cấu trúc. Loại chương trình này được gọi là trình phân tích cú pháp hoặc trình biên dịch-trình biên dịch.
Loại phân tích ngôn ngữ này được phát minh để phân tích tự động ngôn ngữ tự nhiên (như tiếng Anh) nhưng hóa ra điều này hữu ích nhất để phân tích ngôn ngữ máy tính. Một nhà thiết kế ngôn ngữ có thể viết một ngữ pháp nắm bắt ngôn ngữ mới của anh ta, sau đó chạy nó thông qua trình tạo trình phân tích cú pháp để có được một chương trình phân tích ngôn ngữ của anh ta, và dịch, phiên dịch, biên dịch, thực thi, v.v. nếu anh ta muốn.
Trong thực tế, trong hầu hết các trường hợp, bạn không thể thực sự làm điều này. Chẳng hạn, dấu ngoặc đơn cân bằng là một ngôn ngữ không có ngữ cảnh, nhưng một ngôn ngữ bắt buộc phải khai báo tất cả các biến trước khi bạn sử dụng chúng là phân biệt ngữ cảnh. Trình phân tích cú pháp là một phần của trình biên dịch, nhưng cần có logic bổ sung để thực thi các yêu cầu khác này. Những gì bạn phải làm là viết một ngữ pháp nắm bắt càng nhiều ngôn ngữ của bạn càng tốt, chạy nó thông qua một trình tạo trình phân tích cú pháp, sau đó viết mã thực thi phần còn lại của các yêu cầu (trình xử lý bảng biểu tượng, v.v.).
Chúng tôi thường không sử dụng các ngữ pháp nhạy cảm theo ngữ cảnh vì chúng được hỗ trợ kém hơn nhiều. Tôi không biết liệu có tương đương với trình tạo trình phân tích cú pháp LR (k) cho các ngôn ngữ nhạy cảm theo ngữ cảnh hay không. Đúng, một máy Turing (hoặc máy bị ràng buộc tuyến tính) có thể phân tích cú pháp, nhưng tôi không biết liệu có một thuật toán chung để biến ngữ pháp nhạy cảm ngữ cảnh thành một chương trình cho máy Turing hay không, theo nghĩa là một LR (1 ) máy phát điện làm bảng phân tích cú pháp cho máy đẩy xuống. Tôi đoán là các bảng làm nền tảng cho trình phân tích cú pháp sẽ lớn hơn theo cấp số nhân. Trong mọi trường hợp, sinh viên CS (như bản thân tôi, hồi trước) thường được dạy các ngữ pháp không ngữ cảnh và trình tạo trình phân tích cú pháp LR (1) như YACC.