30/09/2018, 20:31

Tìm commented code trong file .c, .h

Chào mọi người,

Mình đang cần có 1 đoạn script (refer python) có thể nhận biết được commented code trong file .c hoặc .h, lấy VD như mình có file C có nội dung như sau:

#include <stdio.h>

/*
 * Main function
 */
int main(int agrc, int* agrv[]) {
    int a = 0, 
    int b = 10;
    // this is commented code in block
    /*int c = 11;
    c++;*/

    if(a > b) {
        a = b;
        // this is commented code in line
        //c++;
    }

    return 0;
}

Đoạn script mình mong muốn tối thiểu phải trả về True (trường hợp file C có tồn tại commented code) hay False (không tồn tại commented code), hoặc cao cấp hơn là xác định dc số line và in ra màn hình nội dung commented code (mình nghĩ khi xác định dc True False thì 2 yêu cầu sau không còn khó nữa)

Search sơ một vòng thì thấy 1 số kết quả có thể kiếm được comment thôi.
Ý tưởng ban đầu:

  • Xác định comment (block hoặc line)
  • Tra trong khối vừa xác định có các keyword hay C statement ko
    Ý tưởng này có lẽ vẫn chưa tối ưu lắm, mời các bạn đóng góp ý tưởng
Khoa Nguyen viết 22:36 ngày 30/09/2018

2 cách có thể nghĩ đến:

  • Regex (awful)
  • AST

Bạn tìm xem Python có .c, .h AST parser nào không

Thành Phạm viết 22:38 ngày 30/09/2018

Code này in được comment này

source = """
#include <stdio.h>

/*
 * Main function
 */
int main(int agrc, int* agrv[]) {
    int a = 0, 
    int b = 10;
    // this is commented code in block
    /*int c = 11;
    c++;gsdfgsdfgsfd
    hdfghfghdfh*/

    if(a > b) {
        a = b;
        // this is commented code in line
        //c++;
    }

    return 0;
}
"""

for i in source.split('\n'):
	if i.strip() != '' and i.strip()[:2]== "//":
		print i


print "=" * 100

lines =source.split('\n')

for i, item in enumerate(lines):
	if item.strip() != '' and item.strip()[:2] == "/*":
		for j, jtem in enumerate(lines[i:]):
			if jtem.strip() != '' and jtem.strip()[-2:] == '*/':
				for k in lines[i:j+i+1]:
					print k
				break

Anh em đừng xem chỉnh sữa nhá

Tung Dao viết 22:45 ngày 30/09/2018

Cái này không đạt yêu cầu r bạn
Mình cần lọc ra những dòng nào là commented code, bạn lọc ra cả commented codecomment r
Mình đang xem các thư viện regex trong python, nếu thành công mình sẽ chia sẽ

Thành Phạm viết 22:35 ngày 30/09/2018

À commented code là code bị comment vậy thì thêm 1 đoạn kiểu kiểu như này chắc là được

keywords = ['int', 'long','if','for']
operators = ['+', '-','<']  # blalblalbla
for i in data:
    for kw_op in keywords + operators + [';']:
        if kw_op in i:
            print 'result:', i
            break


viết 22:40 ngày 30/09/2018

viết 1 cái state machine cũng dễ mà. 1 file .c đọc vào đọc 1-2 ký tự một lúc. Chỉ có khoảng 4 state là normal, string, block comment, line comment
ban đầu ko có gì là ở normal state.
normal -> string: "
normal -> block comment: /* (2 ký tự)
normal -> line comment: // (2 ký tự)
string -> normal: "
line comment -> normal: \n (ký tự xuống dòng)
block comment -> normal: */ (2 ký tự)

ngoài ra còn phải chú ý escape sequence \ nữa

Bài liên quan
0