Là cú pháp của ngôn ngữ C được xác định hoàn toàn bởi CFGs?


7

Tôi nghĩ rằng Câu hỏi là tự đủ. Là cú pháp của Ngôn ngữ C được xác định hoàn toàn thông qua Ngữ pháp miễn phí theo ngữ cảnh hay chúng ta có Cấu trúc ngôn ngữ có thể yêu cầu các định nghĩa Không ngữ cảnh miễn phí trong quá trình phân tích cú pháp không?

Một ví dụ về cấu trúc không CFL tôi nghĩ là khai báo các biến trước khi sử dụng chúng. Nhưng trong Trình biên dịch (Aho Ullman Sethi), ngôn ngữ C không phân biệt giữa các định danh trên cơ sở tên của chúng. Tất cả các định danh được mã hóa thành 'id' bởi Trình phân tích từ điển. Nếu C không hoàn toàn được xác định bởi CFG, xin vui lòng ai có thể đưa ra ví dụ về cấu trúc Non CFL trong C?


Câu trả lời hoàn toàn phụ thuộc vào cách bạn xác định ngôn ngữ của "Chương trình C". Là một chuỗi một chương trình C nếu nó có cú pháp đúng, hay nó là một chương trình C nếu nó tuân thủ toàn bộ đặc tả ngôn ngữ C? Hoặc nó là một chương trình C nếu một số (bộ con) trình biên dịch C tuân thủ tiêu chuẩn có khả năng tạo ra một tệp thực thi có thể thực hiện được từ nó? Tôi luôn ưu tiên các định nghĩa về ngôn ngữ lập trình đòi hỏi một số giá trị ngữ nghĩa, mặc dù điều này thường có nghĩa là các ngôn ngữ không có ngữ cảnh, như trong lời giải thích của bạn.
Patrick87

Câu trả lời:


13

Ngôn ngữ C có quy tắc đánh máy. Ví dụ: bạn không thể chia hai con trỏ và khi bạn gọi một thủ tục chấp nhận một con trỏ, bạn không thể sử dụng một con trỏ. Trình biên dịch AC phân tích nguồn của nó theo nhiều giai đoạn: đầu tiên là phân tích từ vựng, sau đó nguồn được phân tích cú pháp, v.v. Các giai đoạn này là trừu tượng, và trên thực tế, thông tin bổ sung được truyền từ pha này sang pha khác. Ví dụ, mặc dù ngữ pháp của C không quan tâm đến tên của các biến, thông tin này được thông qua và đó là cách ngữ pháp được gán có thể xác minh quy tắc gõ. Vì vậy, có các cơ chế bổ sung làm việc trên đầu của ngữ pháp.

Đối với một ví dụ thậm chí đơn giản hơn, hãy lấy một ví dụ được đưa ra bởi Aho và Ullman. Ở giai đoạn phân tích cú pháp, tất cả các tên biến trông "giống nhau", tuy nhiên bạn không thể sử dụng một biến trừ khi nó được khai báo. Thông tin này được ẩn khỏi trình phân tích cú pháp không ngữ cảnh, nhưng được giữ lại như một thuộc tính cho pha từ vựng và được kiểm tra trong quá trình phân tích cú pháp. Ngữ pháp không ngữ cảnh của C chỉ đại diện cho một số khía cạnh của mã C hợp pháp là gì, rất hữu ích để triển khai trình phân tích cú pháp nhanh. Trên đầu bộ phân tích cú pháp đó, các quy tắc khác được kiểm tra, ngữ nghĩa được trao cho mã C và mã máy được tạo.

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.