Chương trình đọc nội dung code C

tuhocvba

Administrator
Thành viên BQT
Để tránh nhàm chán, tôi kể cho các bạn nghe một kỷ niệm của tôi và cũng là một bài toán cho các bạn giải quyết.
Cách đây khoảng 5 năm, chúng tôi có xây dựng một chương trình VBA đọc code C, liệt kê hết các hằng số và số lượng biến số global, tên các hàm,...

Để làm bài toán ấy chúng ta thu hẹp phạm vi dần dần:
Bài toán lớn : Đọc toàn bộ các file .c
Bài toán nhỏ: Đọc 1 file .c
Bài toán nhỏ hơn: Loại bỏ phần comment có trong file
Bài toán nhỏ hơn nữa: Đọc nội dung của một hàm.

Mang tính chất thuật toán giải thuật, nên tôi đi từ bài toán nhỏ, với giả thiết như sau:
Bây giờ giả thiết tôi có file a.txt (đường dẫn file đã biết) nội dung như sau:
Mã:
int egf(){
   a = a + 2;
   
   return 0;}

int main(){
   
   if(a==b){
    printf("Hello, World! \n");
   }
   return 0;}

int abc2(){
   if(c==d){
    printf("Hello, World! \n");
   }
   return 0;
}
Giả thiết rằng dấu hiệu để phát hiện một hàm luôn luôn là ){
Trong đó hai dấu này viết liên tiếp trong cùng một hàng.
(ở đây tôi cho dễ đi, thực tế các bạn thấy thì người ta viết code hay xuống dòng rồi mới viết {
Mã:
int egf()
{
   a = a + 2;
Các bạn không cần quan tâm tới điều này, hãy cứ lấy giả thiết của tôi làm căn cứ giải quyết bài toán.

Bây giờ output tôi muốn các bạn lấy được đoạn nội dung của hàm int main() là:
Output mong muốn:
   if(a==b){
    printf("Hello, World! \n");
   }
   return 0;
Nội dung này được lưu ra một biến tên là outputtemp.

Nào, mời các bạn động não.
 

Euler

Administrator
Thành viên BQT
Cái khó là:
Một hàm sẽ bắt đầu và kết thúc là
Mã:
{
...Nội dung
}
Nhưng bản thân trong phần nội dung cũng có thể chứa dấu { }, ví dụ:
Mã:
if(a==b){
....
}
Dụng ý của bài tập trên chính là phải xử lý được chỗ này. Cách giải quyết đúng thì bên trong chương trình có bao nhiêu dấu {} đi nữa vẫn xử lý được.
Mã:
if(a==b){
    if(c==d){
            if(e==f){
                    }
        }
}
Mình nói tới đây, các bạn suy nghĩ tiếp xem sao.
 
H

haokira

Guest
Mình sẽ nghĩ theo hướng: Đếm tất cả dấu { (Giả sử là biến n) đến khi xuất hiện dấu } ( giả sử n=10) thì trừ dần n đến khi về 0 là kết thúc hàm đó.
 

tuhocvba

Administrator
Thành viên BQT
Mình sẽ nghĩ theo hướng: Đếm tất cả dấu { (Giả sử là biến n) đến khi xuất hiện dấu } ( giả sử n=10) thì trừ dần n đến khi về 0 là kết thúc hàm đó.
Một ý tưởng không tồi . Tư suy logic rất tốt đọ
 
Top