Tôi đang học cho các ngôn ngữ tính toán của mình và có một ý tưởng tôi đang gặp phải vấn đề trong đầu.Regular vs Context Free Grammars
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 công việc cần thiết cho ngôn ngữ lập trình. Tôi cũng hiểu rằng ngữ cảnh 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 ngôn ngữ lập trình (như palindromes).
Điều tôi đang gặp phải là tìm 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 phân tích ngữ pháp thông thường có thể ánh xạ tới một thiết bị đầu cuối hoặc nonterminal theo sau bởi một thiết bị đầu cuối hoặc bản đồ nonterminal không có ngữ cảnh bất kỳ sự kết hợp của thiết bị đầu cuối và nonterminals.
Ai đó có thể giúp tôi kết hợp tất cả điều này với nhau không?
Đầu tiên: 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 mà các nút trong cây cú pháp có thể được định vị (ví dụ, sự mơ hồ về tính liên kết 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 bên tay phải với một thiết bị không phải là thiết bị đầu cuối (A -> a, A -> aA; và wikipedia thậm chí còn bao gồm epsilon như là giải pháp thay thế thứ ba: http://en.wikipedia.org/wiki/ Regular_grammar) – user764754
sự mơ hồ xuất hiện 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 đường dẫn xuất phát.chỉ đơn giản là có nhiều hơn một quy tắc sản xuất cho một thiết bị đầu cuối không làm cho ngữ pháp không rõ ràng – Sujoy
Ví dụ này thực sự là sai. Nếu chúng ta tưởng tượng toàn bộ quy tắc là 'A-> a | c' và 'B-> b' thì ngữ pháp này cho phép không phải là 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à đúng hơn là hai thiết bị đầu cuối. Khả năng ngữ pháp cho phép palindromes là: 'S -> aSa | bSb | a | b' – gdiazc