Ngữ pháp miễn phí theo ngữ cảnh là gì?


104

Ai đó có thể giải thích cho tôi ngữ pháp không có ngữ cảnh là gì không? Sau khi nhìn vào mục nhập Wikipedia và sau đó là mục nhập Wikipedia về ngữ pháp chính thức, tôi hoàn toàn bối rối. Ai đó sẽ tốt bụng giải thích những điều này là gì?

Tôi đang tự hỏi điều này bởi vì tôi muốn điều tra phân tích cú pháp, và cả về mặt hạn chế của công cụ regex.

Tôi không chắc liệu những thuật ngữ này có liên quan trực tiếp đến lập trình hay chúng liên quan nhiều hơn đến ngôn ngữ học nói chung. Nếu đúng như vậy, tôi xin lỗi, có lẽ điều này có thể được chuyển đi nếu vậy?


2
Nó liên quan đến nhiềuAutomata Theorem
Rahul

2
Nếu bạn quan tâm đến ngôn ngữ chính thức và lý thuyết tự động về phân tích cú pháp, tôi đề xuất một cuốn sách như Ngôn ngữ và Máy móc của Sudkamp hoặc Trình biên dịch của Aho, Sethi & Ullman . Mỗi cuốn sách cung cấp mô tả chính thức về ngữ pháp không có ngữ cảnh, là một loại ngữ pháp chính thức, sau đó nêu và chứng minh các định lý cơ bản về ngữ pháp không có ngữ cảnh cần thiết để hiểu chúng (chẳng hạn như bổ đề bơm cho ngôn ngữ không có ngữ cảnh và chuyển đổi và định lý dạng chuẩn). Không có điều kiện tiên quyết toán học nào để học lý thuyết ngôn ngữ chính thức ngoài sự hiểu biết sơ lược về lý thuyết tập hợp.
danportin

1
Không nên chuyển những câu hỏi như vậy sang Khoa học Máy tính Lý thuyết?
đốm xanh mờ

Câu trả lời:


110

Một ngữ pháp không có ngữ cảnh là một ngữ pháp đáp ứng các thuộc tính nhất định. Trong khoa học máy tính, ngữ pháp mô tả ngôn ngữ; đặc biệt, chúng mô tả các ngôn ngữ chính thức.

Một ngôn ngữ hình thức chỉ là một tập hợp (thuật ngữ toán học chỉ một tập hợp các đối tượng) các chuỗi (chuỗi ký hiệu ... rất giống với cách sử dụng lập trình của từ "string"). Một ví dụ đơn giản về ngôn ngữ chính thức là tập hợp tất cả các chuỗi nhị phân có độ dài ba, {000, 001, 010, 011, 100, 101, 110, 111}.

Ngữ pháp hoạt động bằng cách xác định các phép biến đổi bạn có thể thực hiện để xây dựng một chuỗi bằng ngôn ngữ được ngữ pháp mô tả. Ngữ pháp sẽ cho biết cách chuyển đổi một ký hiệu bắt đầu (thường là S) thành một số chuỗi ký hiệu. Ngữ pháp cho ngôn ngữ đã cho trước đó là:

S -> BBB
B -> 0
B -> 1

Cách giải thích điều này là nói rằng Scó thể được thay thế bằng BBB, và Bcó thể được thay thế bằng 0, và Bcó thể được thay thế bằng 1. Vì vậy, để xây dựng chuỗi 010, chúng ta có thể làm S -> BBB -> 0BB -> 01B -> 010.

Ngữ pháp không có ngữ cảnh chỉ đơn giản là ngữ pháp trong đó thứ bạn đang thay thế (bên trái của mũi tên) là một ký hiệu "không phải đầu cuối". Biểu tượng không phải là ký hiệu đầu cuối là bất kỳ ký hiệu nào bạn sử dụng trong ngữ pháp không thể xuất hiện trong chuỗi cuối cùng của bạn. Trong ngữ pháp trên, "S" và "B" là các ký hiệu không phải đầu cuối, và "0" và "1" là các ký hiệu "đầu cuối". Ngữ pháp như

S -> AB
AB -> 1
A -> AA
B -> 0

Không thường xuyên vì chúng chứa các quy tắc như "AB -> 1".


12
"Không thường xuyên", bạn có nghĩa là "không theo ngữ cảnh"? (vì biểu diễn ngôn ngữ bằng cách CFGs là một siêu bộ những biểu diễn bởi biểu thức thông thường)
Chống Trái đất

3
Có nên "S có thể được thay thế bởi B" đọc "S có thể được thay thế bởi BBB"?
Cosmo Harrigan

4
Lạy chúa, đây là một trong những câu trả lời được giải thích hay nhất mà tôi đã thấy trên SO.
Rafael Dias da Silva

1
@AntiEarth, ví dụ thứ hai không phải là ngữ pháp thông thường vì nó có các quy tắc tạo ra hai ký hiệu không phải đầu cuối từ một ký hiệu không phải là ký hiệu không được phép sử dụng trong ngữ pháp thông thường (ngoài ra, như OP đã chỉ ra, nó có quy tắc với nhiều ký hiệu liên danh trên Bên trái). vi.wikipedia.org/wiki/Regular_grammar
awwsmm

21

Lý thuyết Ngôn ngữ có liên quan đến Lý thuyết Tính toán. Đây là khía cạnh triết học hơn của Khoa học máy tính, về việc quyết định chương trình nào có thể, hoặc chương trình nào sẽ có thể viết được, và loại vấn đề nào không thể viết một thuật toán để giải quyết.

Biểu thức chính quy là một cách mô tả một ngôn ngữ thông thường. Một ngôn ngữ thông thường là một ngôn ngữ có thể được quyết định bởi một tự động hữu hạn xác định.

Bạn nên đọc bài viết về Máy trạng thái hữu hạn: http://en.wikipedia.org/wiki/Finite_state_machine

Và các ngôn ngữ thông thường: http://en.wikipedia.org/wiki/Regular_language

Tất cả các Ngôn ngữ Thông thường đều là Ngôn ngữ Không có Ngữ cảnh, nhưng có những Ngôn ngữ Không có Ngữ cảnh không phải là Ngôn ngữ Thông thường. Ngôn ngữ không có ngữ cảnh là tập hợp tất cả các chuỗi được chấp nhận bởi Trình xử lý không theo ngữ cảnh hoặc Dữ liệu tự động đẩy xuống là Máy trạng thái hữu hạn với một ngăn xếp: http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

Có những ngôn ngữ phức tạp hơn yêu cầu Máy Turing (Bất kỳ chương trình khả thi nào bạn có thể viết trên máy tính của mình) để quyết định xem một chuỗi có phải là ngôn ngữ đó hay không.

Lý thuyết ngôn ngữ cũng rất liên quan đến vấn đề P vs. NP, và một số nội dung thú vị khác.

Cuốn sách nhập môn Khoa học Máy tính năm thứ ba của tôi khá tốt trong việc giải thích điều này: Giới thiệu về Lý thuyết Tính toán. Của Michael Sipser. Nhưng, tôi phải trả khoảng 160 đô la để mua nó mới và nó không lớn lắm. Có thể bạn có thể tìm thấy một bản sao đã sử dụng hoặc tìm một bản sao ở thư viện hoặc một cái gì đó mà nó có thể giúp bạn.

BIÊN TẬP:

Những hạn chế của Biểu thức chính quy và các lớp ngôn ngữ cao hơn đã được nghiên cứu rất nhiều trong hơn 50 năm qua. Bạn có thể quan tâm đến bổ đề bơm cho các ngôn ngữ thông thường. Nó là một phương tiện để chứng minh rằng một ngôn ngữ nhất định không phải là thường xuyên:

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

Nếu một ngôn ngữ không thông thường, nó có thể là Không có ngữ cảnh, có nghĩa là nó có thể được mô tả bởi Trình phân loại ngữ cảnh miễn phí hoặc thậm chí nó có thể ở một lớp ngôn ngữ cao hơn, bạn có thể chứng minh rằng nó không phải Không có ngữ cảnh bằng bổ đề bơm cho Không có ngữ cảnh ngôn ngữ tương tự như ngôn ngữ dành cho cụm từ thông dụng.

Một ngôn ngữ thậm chí có thể không thể quyết định, có nghĩa là ngay cả một máy Turing (có thể lập trình máy tính của bạn có thể chạy) cũng không thể được lập trình để quyết định xem một chuỗi có được chấp nhận như trong ngôn ngữ hay bị từ chối.

Tôi nghĩ rằng phần bạn quan tâm nhất là Máy trạng thái hữu hạn (Cả xác định và xác định) để xem ngôn ngữ nào mà một Biểu thức chính quy có thể quyết định và bổ đề bơm để chứng minh ngôn ngữ nào không chính quy.

Về cơ bản, một ngôn ngữ không thông thường nếu nó cần một số loại trí nhớ hoặc khả năng đếm. Ví dụ, ngôn ngữ của việc khớp dấu ngoặc đơn không thường xuyên vì máy cần nhớ xem nó đã mở một dấu ngoặc đơn hay chưa để biết liệu nó có phải đóng một dấu ngoặc đơn hay không.

Ngôn ngữ của tất cả các chuỗi sử dụng các chữ cái a và b chứa ít nhất ba chữ b là ngôn ngữ thông thường: a ba ba ba

Ngôn ngữ của tất cả các chuỗi sử dụng các chữ cái a và b chứa nhiều b hơn a là không bình thường.

Ngoài ra, bạn không nên cho rằng tất cả các ngôn ngữ hữu hạn đều là thông thường, ví dụ:

Ngôn ngữ của tất cả các chuỗi dài dưới 50 ký tự sử dụng các ký tự a và b chứa nhiều b hơn a là ngôn ngữ thông thường, vì nó là hữu hạn, chúng ta biết nó có thể được mô tả là (b | abb | bab | bba | aabbb | ababb |. ..) vv cho đến khi tất cả các kết hợp có thể được liệt kê.


1
Biểu thức chính quy không phải là chương trình quyết định khớp các chuỗi với các mẫu. Chúng là các biểu thức biểu thị các tập hợp chính quy, mà bài toán thành viên có thể giải quyết được.
danportin

1
Nếu một tập hợp là thông thường thì nó rõ ràng có thể quyết định được. Tôi không biết phải nói thế nào khác. Chúng là những chương trình quyết định hiệu quả mà không có bộ nhớ.
Paul

Bạn đang mô tả dữ liệu tự động hữu hạn xác định, cung cấp thủ tục quyết định cho các ngôn ngữ thông thường ("chương trình quyết định không có bộ nhớ"). Biểu thức thông thường là từ ngữbiểu thị ngôn ngữ thông thường, không phải chương trình là thủ tục. Đây là khiếu nại duy nhất của tôi.
danportin

1
Tôi đã đổi nó thành "Một biểu thức chính quy là một cách mô tả một ngôn ngữ thông thường. Một ngôn ngữ thông thường là một ngôn ngữ có thể được quyết định bởi một tự động hữu hạn xác định." Nghe có hay hơn không?
Paul
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.