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ếuS1S2 không phải là thiết bị đầu cuối tạo biểu thức E1E2 sau đó chúng ta có thể tạo ra E1+E2 bởi S và các quy tắc SS1, SS2. Chúng ta có thể tạo ra sự kết hợpE1E2 bởi S và quy tắc SS1S2. E1 bởi S và các quy tắc SS1S, 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 SS 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 Sa.
  • nếu r=ab (union, cũng được ký hiệu là + hoặc |): xây dựng các ngữ pháp rời rạc cho ab với các biểu tượng bắt đầu SaSb, kết hợp chúng và thêm SSaSb.
  • 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 lr với các biểu tượng bắt đầu SlSr, kết hợp chúng và thêm SSlSr.
  • 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 SSxSΛ.

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