Ngữ pháp và ngữ cảnh nhạy cảm


25

1) Điều gì, nếu có, là mối quan hệ giữa gõ tĩnh và ngữ pháp chính thức?

2) Cụ thể, một máy tự động giới hạn tuyến tính có thể kiểm tra xem, giả sử, một chương trình C ++ hoặc SML đã được gõ tốt không? Một ngăn xếp tự động lồng nhau?

3) Có cách nào tự nhiên để diễn đạt các quy tắc gõ tĩnh trong các thuật ngữ ngữ pháp chính thức không?

Câu trả lời:


20

Các automata giới hạn tuyến tính không thể kiểm tra xem các chương trình C ++, và LBA không thể kiểm tra xem các chương trình SML có được gõ tốt hay không. C ++ có hệ thống loại Turing-Complete, vì bạn có thể mã các chương trình tùy ý dưới dạng siêu biểu đồ mẫu.

SML thú vị hơn. Nó không có kiểm tra loại có thể quyết định, nhưng vấn đề là hoàn thành EXPTIME. Do đó, LBA khó có thể kiểm tra nó, trừ khi có sự sụp đổ rất đáng ngạc nhiên trong hệ thống phân cấp phức tạp. Lý do cho điều này là SML yêu cầu suy luận kiểu và có những họ chương trình có kích thước của loại phát triển nhanh hơn nhiều so với kích thước của chương trình. Ví dụ, xem xét chương trình sau:

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

Đối với các hệ thống loại đơn giản hơn, chẳng hạn như C hoặc Pascal, tôi tin rằng LBA có thể kiểm tra nó.

Trong những ngày đầu nghiên cứu ngôn ngữ lập trình, đôi khi người ta đã sử dụng ngữ pháp van Wingaarden (còn gọi là ngữ pháp hai cấp) để chỉ định hệ thống loại cho ngôn ngữ lập trình. Tôi tin rằng Algol 68 đã được chỉ định theo cách này. Tuy nhiên, tôi được cho biết kỹ thuật này đã bị bỏ rơi vì những lý do thực tế: hóa ra khá khó khăn cho mọi người khi viết ngữ pháp chỉ định những gì họ nghĩ rằng họ đang chỉ định! (Thông thường, các ngữ pháp mà mọi người đã viết tạo ra các ngôn ngữ lớn hơn họ dự định.)

Ngày nay, người ta sử dụng các quy tắc suy luận sơ đồ để chỉ định các hệ thống loại, về cơ bản là một cách chỉ định các vị từ là điểm cố định ít nhất của một tập hợp các mệnh đề Horn. Sự hài lòng đối với các lý thuyết sừng bậc một nói chung là không thể giải quyết được, vì vậy nếu bạn muốn nắm bắt mọi thứ mà các nhà lý thuyết loại, thì bất cứ chủ nghĩa hình thức ngữ pháp nào bạn chọn sẽ mạnh hơn là thực sự tiện lợi.

Tôi biết đã có một số công việc sử dụng ngữ pháp thuộc tính để thực hiện các hệ thống loại. Họ tuyên bố có một số lợi ích kỹ thuật phần mềm cho sự lựa chọn này: cụ thể là luồng thông tin kiểm soát ngữ pháp thuộc tính rất nghiêm ngặt và tôi được bảo rằng điều này giúp việc hiểu chương trình dễ dàng hơn.


4

Theo như tôi biết thì tính chính xác của loại có xu hướng không thể giải quyết được đối với các trường hợp thú vị vì vậy các ngữ pháp chính thức rõ ràng không thể nắm bắt mọi hệ thống loại bạn có thể nghĩ tới.

Tôi biết rằng các trình tạo trình biên dịch chính cho phép các biến vị ngữ tùy ý cho các quy tắc ngăn quy tắc được thực thi nếu vị từ không đánh giá true, vd { type(e1) == type(e2) } (expression e1) '+' (expression e2). Khái niệm này có thể dễ dàng được chính thức hóa; các hạn chế thích hợp đối với các vị từ được phép sau đó có thể mang lại khả năng quyết định bởi các LBA.

Việc quyết định các vị từ như vậy ít nhất là khó khăn đối với thời gian chạy vì vậy tôi đoán mọi người có xu hướng thực hiện phân tích cú pháp lặp, thu thập thông tin trong giai đoạn để kiểm tra tính khả thi trong giai đoạn . Chẳng hạn, bạn có thể xây dựng một bảng tên trong một lần và sau đó kiểm tra xem tất cả các biến được sử dụng có được khai báo (rõ ràng) trong lần chạy thứ hai không.kk+1

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.