Biểu thức chính quy cho ngữ pháp không ngữ cảnh


7

Bất cứ ai cũng biết nếu có một thuật toán để viết trực tiếp ngữ pháp không ngữ cảnh tạo ra một biểu thức chính quy cho trước?


5
Bạn có muốn CFG tạo ra các chuỗi biểu thức chính quy hợp lệ như "a * (a | b)" hay bạn muốn CFG tạo ra các chuỗi như "aaaaab" với biểu thức chính quy "a * (a | b)"?
— Alex ten Brink

Câu trả lời:


9

Tôi giả sử bạn muốn có một ngữ pháp tạo ra cùng ngôn ngữ với biểu thức chính quy định.

Bạn có thể đạt được điều đó bằng các bước sau:

  1. Dịch biểu thức chính quy thành NFA.
  2. Dịch NFA thành một ngữ pháp thông thường (phải-).

Cả hai bản dịch đều là tiêu chuẩn và được trình bày trong sách giáo khoa cơ bản về ngôn ngữ chính thức và automata. Lưu ý rằng bất kỳ ngữ pháp thông thường cũng không có ngữ cảnh.


Vâng, tốt hơn câu trả lời của tôi.
— Hendrik ngày

4

Đúng. Tôi đưa ra câu trả lời cấp cao, không có nhiều chi tiết.

Đầu tiên bạn phải phân tích các biểu thức. Điều đó có thể được thực hiện bằng cách sử dụng một trình phân tích cú pháp đệ quy đơn giản. Một số ví dụ trên web.

Sau đó, bạn nên thêm các quy tắc "ngữ nghĩa" vào trình phân tích cú pháp, khi trở về từ đệ quy. Đó là tiêu chuẩn trong bất kỳ khóa học lý thuyết ngôn ngữ chính thức. NếuS1 và S2 không phải là thiết bị đầu cuối tạo biểu thức E1 và E2 sau đó chúng ta có thể tạo ra E1+E2 bởi S và các quy tắc S→S1, S→S2. Chúng ta có thể tạo ra sự kết hợpE1E2 bởi S và quy tắc S→S1S2. E1∗ bởi S và các quy tắc S→S1S, S→λ. Giả sử chúng ta chọn nonterminals tươi mỗi lần.


1

Giống như câu trả lời trước, tôi giả sử bạn muốn có một ngữ pháp tạo ra cùng ngôn ngữ với biểu thức chính quy định r.

Một thuật toán đệ quy để xây dựng một ngữ pháp không ngữ cảnh G với L(G)=L(r) như sau:

  • nếu r=∅, xuất ra một ngữ pháp không có quy tắc sản xuất (hoặc S→S nếu nó phải có một quy tắc).
  • nếu r=Λ, đầu ra S→Λ.
  • nếu r=a (biểu thức chỉ là một chữ cái), đầu ra S→a.
  • nếu r=a∪b (union, cũng được ký hiệu là + hoặc |): xây dựng các ngữ pháp rời rạc cho a và b với các biểu tượng bắt đầu Sa và Sb, kết hợp chúng và thêm S→Sa∣Sb.
  • nếu r=lr (nối, cũng được ký hiệu là ⋅): xây dựng các ngữ pháp rời rạc cho l và r với các biểu tượng bắt đầu Sl và Sr, kết hợp chúng và thêm S→SlSr.
  • nếu r=x∗ (Ngôi sao Kleene): xây dựng ngữ pháp cho x với biểu tượng bắt đầu Sx và thêm S→SxS∣Λ.

Điều này về cơ bản tương đương với câu trả lời của Hendrik, nhưng với nhiều chi tiết hơn có thể hữu ích.

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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.