Ai đó có thể đưa ra một ví dụ đơn giản nhưng không phải đồ chơi về ngữ pháp nhạy cảm ngữ cảnh không?


12

Tôi đang cố gắng để hiểu ngữ pháp nhạy cảm ngữ cảnh.

Tôi hiểu tại sao ngôn ngữ như

  1. {ww|wMột*}
  2. {mộtnbncn|nN}

không phải là bối cảnh miễn phí, nhưng những gì tôi muốn biết nếu một ngôn ngữ tương tự như phép tính lambda chưa được xử lý là bối cảnh nhạy cảm.

Tôi muốn xem một ví dụ về một đồ chơi đơn giản nhưng không phải đồ chơi (tôi xem xét các ví dụ về đồ chơi ở trên), ví dụ về ngữ pháp nhạy cảm theo ngữ cảnh có thể, đối với một số quy tắc sản xuất, ví dụ, cho biết có hay không một chuỗi ký hiệu hiện đang ở trong phạm vi (ví dụ: khi sản xuất phần thân của hàm).

Các ngữ pháp nhạy cảm ngữ cảnh có đủ mạnh để biến các biến không xác định / không khai báo / không liên kết thành lỗi cú pháp (chứ không phải ngữ nghĩa) không?


1
hầu như tất cả các ngôn ngữ lập trình thực đều nhạy cảm với ngữ cảnh (theo nghĩa chung, nghĩa là kết hợp cả hai ngữ pháp chomsky loại 0 và loại I theo "nhạy cảm ngữ cảnh"). Ví dụ: các biến cần được khai báo trước khi sử dụng, các định danh phải là duy nhất tất cả các bối cảnh yêu cầu này (được gọi là bối cảnh ngữ nghĩa, nhưng có thể gây hiểu nhầm) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .

Chà, "nhạy cảm theo ngữ cảnh" là thuật ngữ tiêu chuẩn cho ngữ pháp loại 1.
rebierpost

Câu trả lời:


8

Vâng, tôi sẽ tin điều này là có thể, nhưng không, tôi không sẵn sàng xây dựng ngữ pháp nhạy cảm theo ngữ cảnh đó. Tôi sẽ giải thích câu trả lời của mình, bằng cách chia câu hỏi thành hai phần khác nhau.

(1) Ví dụ phi đồ chơi sẽ là gì? Nó sẽ phản ánh khai báo các biến. Đề xuất của tôi về một ngôn ngữ như vậy, được trừu tượng hóa từ lập trình thực tế sẽ là một cái gì đó như thế này. Bảng chữ cái là . { w 1 ; w 2 ; Sầu ; w n ( x 1 ; x 2 ; ... ; x m ) | w i , x j{ một , b{một,b,;,(,)} ngôn ngữ Đó là bối cảnh nhạy cảm.

{w1;w2;Giáo dục;wn(x1;x2;Giáo dục;xm)|wTôi,xj{một,b}*, mỗi xj bằng với một số wTôi}

(2) Để hiển thị nó thực sự context-sensitive Tôi sẽ sử dụng hình thức khác. Đó là một máy Turing sử dụng tuyến tính băng của nó: LBA tự động giới hạn tuyến tính. Tôi có thể lập trình nó để thực hiện khớp mẫu / Tôi sẽ liên tục xem xét từng và cố gắng khớp nó với một w j , từng chữ cái thích hợp . LBA tương đương với ngữ pháp nhạy cảm theo ngữ cảnh, nhưng dễ lập trình hơn nhiều.xjwj


Cảm ơn vì bài đăng. Hiện tại tôi chưa quen với các LBA, vì vậy tôi ít bị thuyết phục hơn với điểm (2). Kể từ điểm (1), tôi đang cố gắng xem cách xây dựng các quy tắc sẽ tạo ra, trong đó một tên biến được dự kiến ​​là một biểu thức, chỉ một trong các biến trong phạm vi hiện tại. Tôi không cần phải xem toàn bộ CSG chính thức, nhưng chỉ cần một lời giải thích không chính thức sẽ có hiệu quả. Tôi không thể tưởng tượng làm thế nào để làm điều đó với các tên biến đa biểu tượng, đó là cách sử dụng ngữ cảnh khác với, ví dụ, sử dụng một ngữ cảnh không đầu cuối duy nhất để thỏa thuận số động từ chủ ngữ trong một dẫn xuất câu tiếng Anh.

{ww|wGiáo dục}

{ww|w...}

3
{ww}LRLwRwLmộtMmộtwMmộtbbMmộtRMmộtRRmột

13

[n]

Nhiều ngôn ngữ NP-hard khác cũng có trong CSL vì lý do tương tự, chẳng hạn như CLIQUE.

Ngoài ra còn có các ngôn ngữ khá tự nhiên trong CSL thậm chí còn khó hơn.

Tuy nhiên, tôi không biết bất kỳ cách nào để diễn đạt một CSL tùy ý như một ngữ pháp nhạy cảm theo ngữ cảnh (CSG), ngoài việc sử dụng cấu trúc của Landweber trong Định lý 3 của bài viết của mình. Trong cấu trúc này, CSG mô tả mặt trái của hoạt động của máy tự động giới hạn tuyến tính nhận ra CSL. Sản xuất của CSG mô tả cách một trạng thái cụ thể của máy kết quả từ một lần di chuyển có thể. Một CSG như vậy là bản dịch đơn giản của máy tự động thành ngữ pháp, do đó, nó không nhất thiết phải tương ứng với các tính năng ngôn ngữ như có thể khai báo các biến, nhưng thay vào đó sẽ bị làm chậm bởi các chi tiết của máy tự động.

Nếu bạn khăng khăng đòi CSG chứ không phải CSL và nếu câu hỏi thực tế của bạn cụ thể là muốn xem CSG cho một ngôn ngữ liên quan đến phạm vi biến bị hạn chế, thì câu trả lời của Hendrik Jan dường như là một khởi đầu tốt.


9

Đúng, ngữ pháp nhạy cảm ngữ cảnh (CSG) đủ mạnh để kiểm tra các biến không xác định / không khai báo / không ràng buộc, nhưng thật không may, chúng tôi không biết bất kỳ thuật toán hiệu quả nào để phân tích chuỗi CSG.

Một ví dụ thực tế về ngôn ngữ nhạy cảm ngữ cảnh là ngôn ngữ lập trình C. Một tính năng như khai báo các biến trước rồi sau đó sử dụng chúng làm cho ngôn ngữ C trở thành ngôn ngữ nhạy cảm theo ngữ cảnh (CSL). ( Tôi không biết về phép tính lambda chưa được kiểm tra ).

Và bởi vì chúng tôi không biết bất kỳ thuật toán phân tích tuyến tính nào cho CSL (hoặc CSG). Đó là lý do trong thiết kế trình biên dịch, chúng tôi sử dụng CFG (và chỉ phân tích cú pháp algoritm) để kiểm tra cú pháp vì chúng tôi biết các thuật toán hiệu quả để phân tích CFG (nếu nó ở dạng hạn chế). Trình biên dịch trước tiên phân tích một tính năng không có ngữ cảnh và sau đó xử lý các tính năng nhạy với ngữ cảnh theo cách có vấn đề (ví dụ: kiểm tra bất kỳ biến nào được sử dụng trong bảng ký hiệu nếu được xác định. Nếu không, nó sẽ tạo ra lỗi).

Ngoài ra ngữ pháp nhạy cảm ngữ cảnh được sử dụng trong xử lý ngôn ngữ tự nhiên (NLP). Và hầu hết các ngôn ngữ tự nhiên là ví dụ về các ngôn ngữ nhạy cảm theo ngữ cảnh. (Tôi không chắc chắn về ngôn ngữ tiếng Phạn ).

Tôi sẽ cố gắng giải thích nó bằng một ví dụ ngớ ngẩn nhưng đơn giản (đó chỉ là một ý tưởng, bạn có thể tinh chỉnh nó):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

Bây giờ, sử dụng ngữ pháp này, chúng ta có thể tạo ra một số phát biểu đúng, nhưng một số cũng sai. Ví dụ,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Nhưng

             Grijesh    am       working       [wrong statement]

Lý do: giá trị của <TENSE> phụ thuộc vào giá trị <NOUN> (ví dụ I &lt;TENNSE> --> I am:) và do đó ngữ pháp không tạo ra các câu đúng trong ngôn ngữ tiếng Anh.

Thật ra chúng ta không thể viết một ngữ pháp không ngữ cảnh cho tiếng Anh hoàn chỉnh!

Bạn có thể nhận thấy, bất kỳ trình dịch ngôn ngữ tự nhiên hoặc trình kiểm tra ngữ pháp nào đều không hoạt động chính xác (thử với các câu lệnh dài). Bởi vì vấn đề này xuất hiện dưới thuật toán phân tích cú pháp nhạy cảm ngữ cảnh.


THAM KHẢO : Bạn có thể xem các bài giảng của Tiến sĩ Arun Kumar . Trong một số bài giảng, ông giải thích chính xác những gì bạn quan tâm.


Cảm ơn bạn đã cung cấp thông tin, chắc chắn nó sẽ hữu ích cho những người khác quan tâm đến cùng chủ đề này, nhưng nó chỉ liên quan một phần đến những gì tôi sẽ hỏi. Tôi không liên quan đến việc phân tích chuỗi do CSG tạo ra, nhưng để xem một ví dụ đơn giản - thậm chí ngớ ngẩn - về một CSG chính thức tạo ra sự trừu tượng được hình thành tốt (không có biến không liên kết trong thân hàm). Tôi có thể tưởng tượng một CSG để tạo các chuỗi "tiếng Anh" chính xác, vì một biểu tượng duy nhất có thể điều hướng thỏa thuận chủ ngữ / động từ, nhưng với sự trừu tượng, các biến thường bao gồm nhiều ký hiệu.

1
@BlueBomber: cảm ơn tôi chắc chắn sẽ trả lời bạn, đêm ở Ấn Độ..N Chúc mừng năm mới! :)
Grijesh Chauhan

Có vẻ như tôi chỉ có thể làm điều đó với số lần giới hạn và theo (này) [ meta.scicomp.stackexchange.com/questions/156/ , tôi nên xóa câu hỏi này và đăng lại ở nơi thích hợp hơn ...

@BlueBomber Tôi đã gắn cờ để thay đổi, Bạn cũng có thể làm được.
Grijesh Chauhan

1

(mở rộng ý kiến ​​thành câu trả lời)

Không chắc chắn đây là một ví dụ bạn muốn, dù sao.

Hầu như tất cả các ngôn ngữ lập trình thực sự là bối cảnh nhạy cảm (theo nghĩa nói chung, tức là conflating cả Chomsky type-0 và loại I văn phạm tiếng dưới "bối cảnh nhạy cảm", đó là sự thật dĩ nhiên kể từ khi văn phạm không hạn chế được thậm chí nhiều hơn bối cảnh nhạy cảm hơn so với bối cảnh ngữ pháp nhạy cảm ).

Ví dụ, "biến cần khai báo trước khi sử dụng", "định danh phải là duy nhất", tất cả những đòi hỏi ngữ cảnh (đôi khi refered như bối cảnh ngữ nghĩa, nhưng điều đó có thể gây hiểu lầm, vì nó liên quan đến tính năng cú pháp anyway) xem ví dụ https: // www .cs.purdue.edu / homes / hosking / 502 / ghi chú / 04-semantics.pdf

Ý nghĩa rằng các ví dụ trên là nhạy cảm theo ngữ cảnh (theo nghĩa ngữ pháp / cú pháp cũng như ngữ nghĩa) là bởi vì chúng nói về bối cảnh của chúng (những gì có trước hoặc sau).

Một "biến đã được xác định", là về bối cảnh trước , sử dụng biến. Một "định danh duy nhất", là bối cảnh cho cả những gì đi trước hoặc xuất hiện sau một tuyên bố định danh, v.v.

xem thêm JavaScript có phải là ngôn ngữ tự do không? trên SO


"Nhạy cảm với ngữ cảnh" có nghĩa là loại 1.
Revierpost
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.