C có phải là ngôn ngữ thông thường không?


8

ngôn ngữ thông thường C hoặc C ++ ? Nếu không, chúng ta sẽ đặt các ngôn ngữ lập trình như C / C ++, perl, Python theo danh mục nào?


Không, egrep là ngôn ngữ thông thường; C thì không.
tchrist

Hầu hết các ngôn ngữ lập trình là một số loại ngôn ngữ bối cảnh miễn phí. Đây là lý do tại sao chúng thường được biểu diễn dưới dạng cây trong quá trình biên dịch. vi.wikipedia.org/wiki/Context-free_grammar
Laurent Bourgault-Roy

1
@ LaurentBourgault-Roy Tôi nghĩ rằng hầu hết mọi người thậm chí không có ngữ cảnh vì ngay cả khi họ có CFG, thường có các quy tắc bổ sung được áp dụng bên ngoài CFG
jk.

Ngay cả regex cũng không còn thường xuyên nữa
CodeInChaos

Câu trả lời:


30

Định nghĩa phổ quát duy nhất tôi biết về "ngôn ngữ thông thường" là định nghĩa có thể được phân tích cú pháp bằng một máy tự động hữu hạn xác định, hoặc được biểu thị như một biểu thức chính quy thực sự (không phải là REs mở rộng trong nhiều triển khai hiện tại). Một biểu thức chính quy có thể được viết trong một loạt các ký tự, với khả năng lặp lại vô hạn và các lựa chọn thay thế.

Vì cả C và C ++ đều cho phép lồng các dấu ngoặc, ngoặc và dấu ngoặc vào độ sâu tùy ý, chúng không phải là ngôn ngữ thông thường (kiểm tra Bổ đề bơm để biết chi tiết).


2
Tôi sẽ nói thêm rằng không có ngôn ngữ lập trình sử dụng nào có thể là thường xuyên bởi vì nó thậm chí sẽ không cho phép bất kỳ loại biểu thức số nào.
Giorgio

1
@Giorgio bạn có thể diễn đạt một biểu thức số như một ngôn ngữ thông thường (một chuỗi toán tử xen kẽ và bắt đầu và kết thúc bằng một số) phân tích cú pháp (với các ưu tiên) mặc dù chúng cần một ngữ pháp
ratchet freak

@ratchet freak: Làm thế nào bạn sẽ xử lý dấu ngoặc đơn, ví dụ như trong (1 + 2) * 6?
Giorgio

@Giorgio Tôi nên đã thêm "không có dấu ngoặc đơn"
ratchet freak

1
@Giorgio: Đúng là tầm thường khi các biểu thức postfix đúng về mặt cú pháp không tạo thành một ngôn ngữ thông thường. Không vấn đề. Một ngôn ngữ có thể là cả biểu thức thông thường và tùy ý, bao gồm các biểu thức postfix, miễn là việc kiểm tra ngăn xếp được hoãn lại cho đến khi thời gian chạy. Forth là một ví dụ tuyệt vời, và dc sẽ là một ví dụ khác.
david.pfx
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.