Đây là một sự cải tổ của các chương trình ngữ pháp? hỏi trước bởi Vag và với nhiều lời đề nghị từ các bình luận viên.
Bằng cách nào một ngữ pháp có thể được xem là chỉ định một mô hình tính toán? Ví dụ, nếu chúng ta sử dụng một ngữ pháp không ngữ cảnh đơn giản, chẳng hạn như
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
Giả sử rằng trình phân tích cú pháp không phân biệt giữa các ký hiệu đầu cuối và ký hiệu đại diện như tôi đã trình bày ở đây, thì có thể thực hiện số học đơn giản cho các số có tới 3.
Ví dụ: lấy chuỗi
"2 + 0 + 1"
Chạy trình phân tích cú pháp LR (1) trên chuỗi này sẽ cung cấp cho chúng ta cây cú pháp cụ thể sau đây trong đó kết quả tính toán được lưu trữ ở gốc của cây:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Vì vậy, nếu chúng ta lấy một ngữ pháp làm chương trình và trình tạo trình phân tích cú pháp để làm trình biên dịch , chúng ta có thể xem ngôn ngữ đặc tả ngữ pháp như một ngôn ngữ lập trình không?
Hơn nữa, chúng ta có thể xây dựng các chương trình Turing- Complete bằng cách chỉ định ngữ pháp tương tự như cách bạn có thể xây dựng các chương trình hoàn chỉnh với celullar automata hoặc phép tính lambda không?
Nói cách khác, người ta biết rằng trong ý nghĩa nhận biết một ngôn ngữ, các ngôn ngữ thông thường tương ứng với automata trạng thái hữu hạn , các ngôn ngữ không ngữ cảnh tương ứng với tự động đẩy xuống và các ngôn ngữ nhạy cảm ngữ cảnh tương ứng với automata giới hạn tuyến tính . Tuy nhiên, nếu chúng ta xem ngữ pháp như các thiết bị tính toán (nghĩa là các chương trình theo nghĩa của ví dụ trên), thì làm thế nào để chúng ta phân loại sức mạnh tính toán của từng lớp ngữ pháp trong hệ thống phân cấp Chomsky?
- Ngữ pháp thông thường
- Ngữ pháp không ngữ cảnh
- Ngữ pháp nhạy cảm ngữ cảnh
- Ngữ pháp không giới hạn (đối với các ngôn ngữ đệ quy đệ quy )
Ngoài ra, làm thế nào về các lớp con ngữ pháp ít được biết đến như,
- Các ngữ pháp không ngữ cảnh xác định (cũng là LR (k) / LL (k) / SLR / LALR, v.v.)
- Các ngữ pháp lồng nhau
- Cây ngữ pháp liền kề
- Chỉ mục ngữ pháp
EDIT: Nhân tiện , đây là một câu hỏi của riêng tôi nhưng tôi không đề cập đến việc tôi không đưa ra biểu tượng bắt đầu cho ngữ pháp ví dụ và vẫy tay khi cần phân biệt giữa thiết bị đầu cuối và số không. Về mặt kỹ thuật hoặc truyền thống, tôi nghĩ rằng ngữ pháp có thể phải được viết ở dạng phức tạp hơn như thế này (trong đó S là ký hiệu bắt đầu và $ đại diện cho thiết bị đầu cuối cuối luồng):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... không phải là nó thực sự thay đổi bất cứ điều gì, nhưng tôi nghĩ tôi nên đề cập đến nó.
EDIT: Một điều khác xuất hiện trong đầu tôi khi tôi đọc câu trả lời của gasche là mỗi nhánh trong cây trong ví dụ của tôi đại diện cho một tính toán phụ. Nếu bạn xem mỗi quy tắc sản xuất là một hàm trong đó LHS biểu thị kết quả và RHS đại diện cho các đối số của nó, thì cấu trúc của ngữ pháp xác định cách các hàm được tạo.
Nói cách khác, bối cảnh của trình phân tích cú pháp cùng với cơ chế nhìn của nó giúp xác định không chỉ các hàm nào được áp dụng ('giống như đa hình tham số) mà còn nên kết hợp chúng như thế nào để tạo thành các hàm mới.
Ít nhất, tôi đoán bạn có thể nhìn nó theo cách này cho CFG rõ ràng, đối với các ngữ pháp khác, thể dục dụng cụ tinh thần là một chút quá nhiều đối với tôi ngay bây giờ.