Ngữ pháp miễn phí theo ngữ cảnh và thông thường


96

Tôi đang ôn thi cho bài kiểm tra ngôn ngữ máy tính của mình và có một ý kiến ​​mà tôi đang gặp khó khăn trong đầu.

Tôi hiểu rằng ngữ pháp thông thường đơn giản hơn và không thể chứa sự mơ hồ, nhưng không thể thực hiện nhiều tác vụ bắt buộc đối với ngôn ngữ lập trình. Tôi cũng hiểu rằng ngữ pháp không có ngữ cảnh cho phép sự mơ hồ, nhưng cho phép một số thứ cần thiết cho các ngôn ngữ lập trình (như palindromes).

Điều tôi gặp khó khăn là hiểu cách tôi có thể lấy được tất cả những điều trên bằng cách biết rằng các danh ngữ ngữ pháp thông thường có thể ánh xạ tới một thiết bị đầu cuối hoặc một danh nghĩa theo sau bởi một thiết bị đầu cuối hoặc một bản đồ ngữ không có ngữ cảnh tới bất kỳ sự kết hợp nào của thiết bị đầu cuối và danh nghĩa .

Ai đó có thể giúp tôi đặt tất cả những điều này lại với nhau không?

Câu trả lời:


70

Ngữ pháp thông thường là tuyến tính bên phải hoặc bên trái, trong khi ngữ pháp không có ngữ cảnh về cơ bản là bất kỳ sự kết hợp nào giữa các thiết bị đầu cuối và không đầu cuối. Do đó, bạn có thể thấy rằng ngữ pháp thông thường là một tập hợp con của ngữ pháp không có ngữ cảnh.

Vì vậy, đối với một palindrome chẳng hạn, có dạng,

S->ABA
A->something
B->something

Bạn có thể thấy rõ rằng palindromes không thể được diễn đạt bằng ngữ pháp thông thường vì nó cần phải là tuyến tính bên phải hoặc bên trái và như vậy không thể có một đầu cuối ở cả hai bên.

Vì ngữ pháp thông thường không mơ hồ, nên chỉ có một quy tắc sản xuất cho một ký tự không đầu cuối nhất định, trong khi có thể có nhiều quy tắc trong trường hợp ngữ pháp không có ngữ cảnh.


13
Thứ nhất: Các ngữ pháp thông thường có thể không rõ ràng (ví dụ từ Kai Kuchenbecker: S -> aA | aB, B -> a, A -> a). Điều duy nhất là chỉ có một cách các nút trong cây cú pháp có thể được định vị (ví dụ: sự mơ hồ về tính kết hợp không tồn tại khi một ngữ pháp thông thường được sử dụng). Thứ hai: Có thể có nhiều hơn một phía bên phải cho một không phải đầu cuối (A -> a, A -> aA; và wikipedia thậm chí còn bao gồm epsilon như một sự thay thế thứ ba: en.wikipedia.org/wiki/Regular_grammar )
user764754

1
sự mơ hồ xảy ra khi một câu có thể được bắt nguồn từ ngữ pháp của bạn trong nhiều hơn một con đường dẫn xuất. chỉ đơn giản là có nhiều hơn một nguyên tắc sản xuất cho một tổ chức phi-thiết bị đầu cuối không làm cho ngữ pháp mơ hồ
Sujoy

11
Ví dụ này thực sự sai. Nếu chúng ta tưởng tượng ra các quy tắc đầy đủ A-> a | cB->bthì ngữ pháp này cho phép không phải palindromes. Ví dụ, tôi có thể sản xuất: S->ABA->aBA->abA->abc. Vấn đề là chúng ta không muốn tạo ra hai biến trong quy tắc đầu tiên, mà là hai thiết bị đầu cuối. Một khả năng cho một ngữ pháp cho phép palindromes là:S -> aSa | bSb | a | b
gdiazc

Có những palindromes có thể được diễn đạt bằng một ngữ pháp thông thường: những palindromes bao gồm một ký tự duy nhất. Ví dụ, S -> aSa | ea(aa)*acả hai đều mô tả một ngôn ngữ thông thường. Điều này cho thấy CFG có thể mô tả một ngôn ngữ thông thường, ngay cả khi nó vi phạm tính tuyến tính bên trái hoặc bên phải. Phải thừa nhận rằng, đây là một palindrome không quá rõ ràng ..
Martijn

Nghĩ lại, câu trả lời này thực sự sai. Nó nói rằng ngữ pháp "không có ngữ cảnh" về cơ bản là bất kỳ sự kết hợp nào giữa các thiết bị đầu cuối và không phải thiết bị đầu cuối. "Tuy nhiên, tu ^ nvw ^ mxy ^ kz là sự kết hợp của các thiết bị đầu cuối và danh nghĩa, nhưng không phải là không có ngữ cảnh.
Charlie Martin

58

Tôi nghĩ những gì bạn muốn nghĩ đến là các lemmata bơm khác nhau. Một ngôn ngữ thông thường có thể được nhận dạng bởi một tự động hữu hạn. Một ngôn ngữ không có ngữ cảnh yêu cầu một ngăn xếp và một ngôn ngữ nhạy cảm theo ngữ cảnh yêu cầu hai ngăn xếp (tương đương với việc nói rằng nó yêu cầu một máy Turing đầy đủ.)

Vì vậy, nếu chúng ta nghĩ về bổ đề bơm cho các ngôn ngữ thông thường , về cơ bản, điều nó nói là bất kỳ ngôn ngữ thông thường nào cũng có thể được chia thành ba phần, x , yz , trong đó tất cả các thể hiện của ngôn ngữ đều ở dạng xy * z (trong đó * là sự lặp lại Kleene, tức là 0 hoặc nhiều bản sao của y .) Về cơ bản, bạn có một "danh nghĩa" có thể được mở rộng.

Bây giờ, những gì về ngôn ngữ không có ngữ cảnh? Có một bổ đề bơm tương tự cho các ngôn ngữ không có ngữ cảnh chia các chuỗi trong ngôn ngữ thành năm phần, uvxyz và trong đó tất cả các phiên bản của ngôn ngữ đều ở uv i xy i z , với i ≥ 0. Bây giờ, bạn có hai "danh nghĩa "có thể được sao chép hoặc bơm, miễn là bạn có cùng số lượng .


10
Một ngôn ngữ nhạy cảm với ngữ cảnh không yêu cầu một máy Turing đầy đủ. Một ô tô tự động giới hạn tuyến tính là đủ. Đây là máy Turing có băng là hữu hạn, kích thước được giới hạn bởi một hàm tuyến tính nào đó trên chuỗi đầu vào.
Dave Clarke

16

Sự khác biệt giữa ngữ pháp thông thường và ngữ cảnh tự do: (N, Σ, P, S): thiết bị đầu cuối, danh nghĩa, sản phẩm, trạng thái bắt đầu Ký hiệu đầu cuối

● các ký hiệu cơ bản của ngôn ngữ được xác định bởi một ngữ pháp chính thức

● abc

Các ký hiệu danh nghĩa (hoặc các biến cú pháp)

● được thay thế bằng các nhóm ký hiệu đầu cuối theo quy tắc sản xuất

● ABC

ngữ pháp thông thường: phải hoặc trái ngữ pháp thông thường, đúng ngữ pháp thông thường, tất cả các quy tắc tuân theo các mẫu

  1. B → a trong đó B là điểm cuối ở N và a là điểm cuối ở Σ
  2. B → aC trong đó B và C ở N và a ở Σ
  3. B → ε trong đó B thuộc N và ε biểu thị chuỗi rỗng, tức là chuỗi có độ dài 0

trái ngữ pháp thông thường, tất cả các quy tắc tuân theo các biểu mẫu

  1. A → a trong đó A là ký tự ở N và a là ký tự cuối ở Σ
  2. A → Ba trong đó A và B ở N và a ở Σ
  3. A → ε trong đó A thuộc N và ε là chuỗi rỗng

ngữ pháp không có ngữ cảnh (CFG)

○ ngữ pháp chính thức trong đó mọi quy tắc sản xuất đều có dạng V → w

○ V là một ký hiệu danh nghĩa duy nhất

○ w là một chuỗi các thiết bị đầu cuối và / hoặc danh nghĩa (w có thể để trống)


5

Ngữ pháp thông thường: - ngữ pháp chứa sản xuất như sau là RG:

V->TV or VT
V->T

trong đó V = biến và T = đầu cuối

RG có thể là Ngữ pháp tuyến tính trái hoặc Ngữ pháp tuyến tính phải, nhưng không phải Ngữ pháp tuyến tính trung bình.

Như chúng ta biết tất cả RG đều là Ngữ pháp tuyến tính nhưng chỉ Ngữ pháp tuyến tính trái hoặc Ngữ pháp tuyến tính phải là RG.

Một ngữ pháp thông thường có thể không rõ ràng.

S->aA|aB
A->a
B->a

Ngữ pháp mơ hồ: - đối với một chuỗi x của chúng tồn tại nhiều hơn một LMD hoặc Nhiều hơn RMD hoặc Nhiều hơn một cây Phân tích cú pháp hoặc Một LMD và Một RMD nhưng cả hai đều tạo ra cây Phân tích cú pháp khác nhau.

                S                   S

              /   \               /   \
             a     A             a     B
                    \                   \
                     a                   a

Ngữ pháp này là Ngữ pháp mơ hồ vì hai cây phân tích cú pháp.

CFG: - Một ngữ pháp được cho là CFG nếu Sản xuất của nó có dạng:

   V->@   where @ belongs to (V+T)*

DCFL: - như chúng ta biết tất cả DCFL là Ngữ pháp LL (1) và tất cả LL (1) là LR (1) nên không bao giờ được mơ hồ. vì vậy DCFG không bao giờ là mơ hồ.

Chúng tôi cũng biết tất cả RL là DCFL nên RL không bao giờ mơ hồ. Lưu ý rằng RG có thể không rõ ràng nhưng RL thì không.

CFL: CFl Có thể mơ hồ hoặc không.

Lưu ý: RL không bao giờ mơ hồ.


4

Biểu thức chính quy

  • Cơ sở phân tích từ vựng
  • Trình bày các ngôn ngữ thông thường

Ngữ pháp miễn phí theo ngữ cảnh

  • Cơ sở phân tích cú pháp
  • Biểu diễn cấu trúc ngôn ngữ

nhập mô tả hình ảnh ở đây


Không, đó là mô tả ngắn, vui lòng đọc lại và kiểm tra hình ảnh.
Ahmed Salem

3

Ngữ pháp là không có ngữ cảnh nếu tất cả các quy tắc sản xuất có dạng: A (nghĩa là, phía bên trái của quy tắc chỉ có thể là một biến duy nhất; phía bên phải không bị giới hạn và có thể là bất kỳ chuỗi đầu cuối và biến nào). Chúng ta có thể định nghĩa văn phạm là 4 bộ trong đó V là tập hữu hạn (biến), _ là tập hữu hạn (thiết bị đầu cuối), S là biến bắt đầu và R là tập hữu hạn các quy tắc, mỗi trong số đó là một ánh xạ V
ngữ pháp thông thường là tuyến tính bên phải hoặc bên trái, trong khi ngữ pháp tự do ngữ cảnh về cơ bản là bất kỳ sự kết hợp nào của thiết bị đầu cuối và không đầu cuối. do đó chúng ta có thể nói rằng ngữ pháp thông thường là một tập hợp con của ngữ pháp không có ngữ cảnh. Sau những thuộc tính này, chúng ta có thể nói rằng tập hợp Ngôn ngữ tự do theo ngữ cảnh cũng chứa tập hợp Ngôn ngữ thông thường


-1

Về cơ bản ngữ pháp thông thường là một tập con của ngữ pháp không có ngữ cảnh, nhưng chúng ta không thể nói Mọi ngữ pháp không có ngữ cảnh đều là ngữ pháp thông thường. Chủ yếu ngữ pháp không có ngữ cảnh là mơ hồ và ngữ pháp thông thường có thể mơ hồ.


-4

một máy chấm thông thường không bao giờ mơ hồ vì nó là tuyến tính trái hoặc tuyến tính phải, vì vậy chúng tôi không thể tạo hai cây quyết định cho máy cắt thông thường để nó luôn rõ ràng. nhưng khác với ngữ pháp thông thường, tất cả đều có thể có hoặc có thể không đều


4
@dinesh Một ngữ pháp thông thường có thể không rõ ràng. Nhớ lại rằng một ngữ pháp là mơ hồ nếu tồn tại hai cây cú pháp khác nhau và một cây cú pháp được gắn nhãn. Do đó cây đẳng lập là những cây khác nhau. Tức là một ngữ pháp đơn giản như S -> aA | aB, B -> a, A -> a là mơ hồ vì tồn tại hai cây cú pháp cho từ 'aa' là từ ghép đẳng lập nhưng khác nhau.
Kai Kuchenbecker
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.