Định nghĩa union tron gC

Một phần của tài liệu (LUẬN văn THẠC sĩ) ứng dụng mô hình ngôn ngữ ngữ nghĩa thống kê trong gợi ý mã cho ngôn ngữ c (Trang 31)

Các thông tin có thể nhận được khi duyệt qua một định nghĩa union (hình 3.6) như từ khóa union, tên union (Data), kiểu dữ liệu và tên các thuộc tính của union (i, f, str), và biến được khai báo data. Các nghĩa vị thu được là:

UNION START,

TYPE(int), VAR(int, var), TYPE(float), VAR(float, var), TYPE(char), VAR(char [20], var), UNION END,

VAR(union_type, var).

Tương tự như struct, chúng ta cũng có thể định nghĩa nhiều union trong một tệp mã nguồn C, vì vậy luận văn đã lưu trữ thông tin về union (tên, các thuộc tính) trong một lớp UnionInfo. Mỗi một tệp mã nguồn nếu chứa các định nghĩa union sẽ sử dụng một danh sách để lưu trữ các đối tượng của lớp UnionInfo.

Ví dụ 4: Duyệt một khai báo tên đại diện cho một kiểu dữ liệu “typedef unsigned char BYTE;” ta thu được thông tin về kiểu dữ liệu “typedef unsigned char” và tên đại diện cho kiểu dữ liệu này “BYTE”. Các nghĩa vị thu được là: TYPE(typedef unsigned char), VAR(unsigned char, var).

Qua bốn ví dụ trên, chúng ta có thể hình dung được chương trình gợi ý mã sẽ duyệt và thu thập thông tin, cũng như biểu diễn nghĩa vị của các nút lưu trữ thông tin khai báo toàn cục.

3.2.2.2 Nút lưu trữ thông tin hàm

Xem xét tới một hàm, ta có thể phân chia thành hai thành phần chính là đầu hàm và thân hàm. Khi duyệt đầu hàm, chúng ta có thể thu thập được các thông tin như kiểu kết quả trả về, tên hàm, các đối số (nếu có). Thân hàm bao gồm một tập các khai báo cũng như các câu lệnh, vì vậy thông tin thu được sẽ đa dạng hơn so với đầu hàm. Để nắm rõ được cách duyệt hàm, chúng ta xét ví dụ trong hình 3.7.

void test(int a){

for(int i = 0; i < a; i++){ if(i < 10){ printf("value of i: %d\n", i); } } } Hình 3. 7. Duyệt một hàm

Duyệt đầu hàm “void test(int a)” ta sẽ thu được các thành phần như kiểu kết quả trả về void, tên hàm test, và đối số a có kiểu dữ liệu int. Trong khi đó, thân hàm bao gồm một vòng lặp for, một câu lệnh điều kiện if và một lời gọi hàm thực thi in giá trị ra màn hình. Như đã nhắc đến trong mục 3.1.2, các khối sẽ được lưu trữ là test, for và if. Các biểu diễn ngữ nghĩa của hàm này được liệt kê như sau:

FUNCTION START TYPE(int) VAR(int, var) FOR

TYPE(int) VAR(int, var) OP(ass_equal) LIT(int) VAR(int, var) OP(rel_less) VAR(int, var)

VAR(int, var) UOP(ari_increment) IF

VAR(int, var) OP(rel_less) LIT(int)

FUNC_ACCESS(void (),printf) LIT(const char *) VAR(int, var) IFEND

FOREND

FUNCTION END

Nghĩa vị bắt đầu của một hàm là FUNCTION START và kết thúc hàm là FUNCTION END. Đối số được biểu diễn tương ứng là TYPE(int) VAR(int, var). Trong thân hàm,

nhiều nghĩa vị được chỉ ra như FOR, IF, FUNC_ACCESS(void (),printf), … Tất cả các nghĩa vị của hàm test trong hình 3.7 được biểu diễn dựa trên bảng nguyên tắc đã được trình bày trong mục 3.1.1. Đây là một ví dụ về biểu diễn một hàm đơn giản, nhưng từ đấy chúng ta có thể hiểu được cách thức chương trình thực hiện đọc các hàm trong mã nguồn C và đưa ra các nghĩa vị tương ứng. Các hàm phức tạp khác cũng sẽ được biểu diễn tương tự như hàm này chỉ khác về nội dung và độ dài của các nghĩa vị.

3.2.2.3 Nút lưu trữ thông tin có vấn đề

Thông tin có vấn đề gặp phải khi duyệt một tệp mã nguồn có thể là do sai cú

pháp, ngữ nghĩa, hoặc chưa hoàn chỉnh. Với mục đích áp dụng SLAMC trong gợi mã

cho ngôn ngữ C nên luận văn chỉ xét trường hợp gặp thông tin có vấn đề khi tệp chưa hoàn chỉnh. Chúng ta xem xét chi tiết trường hợp này thông qua một hàm test trong hình 3.8.

void test(int a){

for(int i = 0; i < a; i++){ int b = 1; if(i < 10){ printf("value of i: %d\n", i); i = } } } Hình 3. 8. Tệp chưa hoàn chỉnh

Trong hàm test, dòng lệnh “i = ” được coi là chưa hoàn chỉnh. Thông thường, các biến sẽ được lưu trữ trong các nút tương ứng và các nút này chứa thông tin về kiểu dữ liệu cũng như các thông tin khác của biến. Nhưng trong trường hợp này thư viện Eclise CDT parser không thể lưu trữ thông tin về kiểu dữ liệu của i, vì vậy chúng ta phải tìm kiếm kiểu dữ liệu của i dựa trên các thông tin đã được duyệt trước đấy. Giả sử ta tìm được kiểu dữ liệu của i là int thì sau dấu “=” có thể là một biến kiểu int (ví dụ: a, b, i) hoặc một giá trị kiểu int (ví dụ: 1, 2, 3, …). Các gợi ý chính xác được đưa ra sẽ dựa vào việc huấn luyện các tệp mã nguồn, phạm vi của vị trí chưa hoàn chỉnh, và một số yếu tố khác sẽ được trình bày chi tiết trong mục 3.2.4.

3.2.3Huấn luyện mô hình n-gram chủ đề và kết hợp cặp giá trị

Chương trình mô phỏng thực hiện huấn luyện mô hình n-gram chủ đề cho ngôn

ngữ C theo thuật toán như trong hình 2.1. Từ những thông tin đã được trích xuất sau khi duyệt cây cú pháp như các hàm, các toán tử, các kiểu dữ liệu, các biến, … chương trình sẽ thực hiện khởi tạo ngẫu nhiên các biến tiềm ẩn như tỷ lệ chủ đề θ và các bài tập chủ đề zi, sau đó việc tính phân phối từ tố cũng như tính lại tỷ lệ chủ đề được tiến hành. Qua quá trình huấn luyện n-gram chủ đề, chúng ta thu được một tập từ vựng V,

phân phối từ tố φk,l , tỷ lệ chủ đề θ, và mỗi tệp mã nguồn sẽ được biểu diễn tương ứng bởi một chuỗi s.

Tiếp theo, việc huấn luyện sự kết hợp của các cặp giá trị được thực hiện. Trong chương trình mô phỏng này chỉ xét các cặp giá trị trong phạm vi của cùng một hàm. Sau đó, lưu trữ tất cả các cặp giá trị, số lần xuất hiện và xác suất xuất hiện tương ứng với các cặp giá trị nhằm sử dụng cho các tính toán về sau.

3.2.4Gợi ý mã

Trong mục này luận văn sẽ trình bày cách thức đưa ra danh sách các từ tố có thể được gợi ý. Đầu vào của chương trình là một tệp mã nguồn C chưa hoàn chỉnh. Chương trình sẽ xác định vị trí gặp nút có vấn đề là nút hiện thời và thực hiện một số bước để có thể đưa ra danh sách các từ tố được gợi ý phù hợp hoặc cũng có thể không có gợi ý nào được đưa ra. Các bước lần lượt là:

 Mở rộng từ tố liên quan

 Tính điểm liên quan

 Kiểm tra sự phù hợp ngữ cảnh

 Biến đổi tới các biểu mẫu từ vựng

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> #include <stdio.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book; int a = 11; void suggest(){ int b = 6; short c = 4; int d = b + }

Hình 3. 9. Gợi ý mã cho tệp chưa hoàn chỉnh

Giả sử đầu vào của chúng ta là một tệp chưa đầy đủ như trong hình 3.9. Thông tin chưa đầy đủ được xác định tại dòng 17 là “int d = b +”. Biểu diễn nghĩa vị của toàn bộ tệp này là khá dài, nên duy nhất chuỗi nghĩa vị của dòng 16 và 17 sẽ được liệt kê như sau:

TYPE(short) -- 1

VAR(short int, var) -- 2 OP(ass_equal) -- 3 LIT(int) -- 4 TYPE(int) -- 5 VAR(int, var) -- 6 OP(ass_equal) -- 7 VAR(int, var) -- 8 OP(ari_add) -- 9

Cho rằng các nghĩa vị của hai dòng 16 và 17 được đánh số thứ tự từ 1 đến 9 (Tất cả các nghĩa vị được đánh số thứ tự từ 1 đến phần tử cuối cùng). Xét một chuỗi 6- gram từ vị trí thứ 4 đến vị trí thứ 9 là [4, 5, 6, 7, 8, 9]. Vị trí tiếp theo (sau 9) sẽ là từ tố cần được gợi ý. Việc mở rộng từ tố liên quan gồm hai bước. Bước một là trích xuất các tập con (tập liên quan) của chuỗi này, mỗi tập liên quan được trích xuất bởi sử dụng một vòng lặp for có biến đếm tăng một đơn vị sau mỗi vòng lặp và duyệt từ trái sang phải để lấy ra tập con từ vị trí đếm đến vị trí kết thúc của chuỗi. Theo như đó, xét chuỗi 6-gram ở trên ta thu được các tập liên quan như sau: [4, 5, 6, 7, 8, 9], [5, 6, 7, 8, 9], [6, 7, 8, 9], [7, 8, 9], [8, 9], [9]. Bước hai là duyệt từng tập liên quan vừa thu được và kiểm tra sự tồn tại của các tập này trong cây tiền tố (cây tiền tố này chứa tất cả các

n-gram của các tệp mã nguồn đã được huấn luyện và lưu trữ các thông tin cần thiết khác), nếu tồn tại chúng ta lấy ra tất cả các tập con có thể được sinh ra từ tập này và tính trọng số cho từng tập con. Trọng số của từng tập con được tính bằng cách lấy số lần xuất hiện của tập này chia cho tổng số lần xuất hiện các tập con của tập liên quan. Ví dụ, tập liên quan [7, 8, 9] thuộc cây tiền tố, và có các tập con là [7, 8, 9, 11] xuất hiện 2 lần, [7, 8, 9, 1] xuất hiện 1 lần, và [7, 8, 9, 15] xuất hiện 3 lần. Như vậy, tổng số tập con của tập liên quan [7, 8, 9] là 6 và vì thế ta tính được trọng số (weight) của các tập con như sau:

weight[7, 8, 9, 11] = 2/6 weight[7, 8, 9, 1] = 1/6 weight[7, 8, 9, 15] = 3/6

Tương tự ta sẽ tính được trọng số cho tất cả các tập con của các tập liên quan. Nút có chỉ số là 11 được coi là nút có thể được mở rộng. Như trên chúng ta đã tính trọng số của nút có chỉ số 11 trong tập [7, 8, 9, 11], nhưng cũng có trường hợp nút có chỉ số 11 sẽ thuộc một tập con của một tập liên quan khác. Ví dụ, tập liên quan [8, 9] có tập con là [8, 9, 11] và trọng số weight[8, 9, 11] = 3/6. Để thu được một danh sách các tập hợp mà có các nút mở rộng là duy nhất, cùng với trọng số là lớn nhất chúng ta sẽ loại tập con weight[7, 8, 9, 11] vì trọng số của tập con này là 2/6 nhỏ hơn 3/6 của

tập [8, 9, 11]. Tập con [8, 9, 11] với trọng số 3/6 và nút mở rộng 11 được lưu trữ lại. Theo như đó tất cả các trường hợp khác cũng được xét tương tự.

Qua quá trình mở rộng từ tố liên quan, chúng ta đã thu được một danh sách các từ tố có thể mở rộng cùng trọng số tương ứng. Tiếp theo, chúng ta xét các cặp giá trị (sự kết hợp của từ tố có chỉ số 9 với một từ tố khác) có thể xuất hiện cùng nhau (mục 2.2.3), ta cũng tính được các trọng số (trọng số của một cặp giá trị chính xác là lấy tỷ lệ của số lần xuất hiện cặp giá trị này so với tổng số lần xuất hiện của tất cả các cặp giá trị có chứa từ tố có chỉ số 9) và lưu trữ vào một danh sách.

Cuối cùng, kiểm tra sự kết hợp của chuỗi 6-gram ban đầu với từng phần tử trong danh sách các từ tố có thể mở rộng (ta được chuỗi 7-gram) liệu có tồn tại trong bảng từ điển n-gram (bảng từ điển n-gram thu được sau quá trình huấn luyện) hay không. Nếu sự kết hợp nào không tồn tại sẽ được gán trọng số bằng 0. Ngược lại, sự kết hợp tồn tại sẽ được tính trọng số bởi công thức 3.1:

weight = 𝑇𝑜𝑝𝑖𝑐𝐷𝑜𝑐𝑠_𝑅𝑎𝑡𝑖𝑜(𝑝𝑟𝑒𝑑𝑖𝑐𝑡)

𝑇𝑜𝑐𝑝𝑖𝑐𝐷𝑜𝑐𝑠_𝑅𝑎𝑡𝑖𝑜(𝑞𝑢𝑒𝑟𝑦) (3.1)

Trong đó, query là chuỗi 6-gram ban đầu, predict là chuỗi 7-gram được tạo ra bởi sự kết hợp chuỗi 6-gram ban đầu và một phần tử trong danh sách các từ tố có thể mở rộng. TopicDocs_Ratio là một danh sách lưu trữ tỷ lệ của n-gram cụ thể mang topic k so với tổng số n-gram mang topic k. Ví dụ, ta có n-gram g, thì Topicdocs_Ratio(g) được tính theo công thức 3.2.

TopicDocs_Ratio(g) = 𝑆ố 𝑙ầ𝑛 𝑥𝑢ấ𝑡 ℎ𝑖ệ𝑛 𝑐ủ𝑎 𝑛−𝑔𝑟𝑎𝑚 𝑔 𝑚𝑎𝑛𝑔 𝑡𝑜𝑝𝑖𝑐 𝑘

𝑇ổ𝑛𝑔 𝑠ố 𝑛−𝑔𝑟𝑎𝑚 𝑚𝑎𝑛𝑔 𝑡𝑜𝑝𝑖𝑐 𝑘 (3.2)

Tiếp theo, chúng ta tính điểm liên quan sử dụng phương pháp tính tổng trọng số theo công thức 2.10. Danh sách nhận được sau cùng lưu trữ các tổng trọng số đã qua kết hợp các yếu tố và các tiền tố có thể mở rộng. Sắp xếp lại danh sách này với trọng số giảm dần và lấy ra 20 phần tử đầu tiên có trọng số cao nhất. Xét từng phần tử, nếu là biến và phù hợp ngữ cảnh cũng như phạm vi thì chuyển đổi thành từ vựng lưu trữ trong danh sách gợi ý. Cuối cùng, danh sách gợi ý thu được nếu khác rỗng sẽ được hiển thị.

3.3 Sơ đồ thuật toán

Trong mục này luận văn sẽ trình bày một số sơ đồ thuật toán chính để xây dựng

chương trình áp dụng SLAMC trong gợi ý mã cho ngôn ngữ C. Danh sách các sơ đồ

như sau:

 Sơ đồ thuật toán ở mức tổng quan

 Sơ đồ thuật toán duyệt cây cú pháp trừu tượng

 Các sơ đồ thuật toán huấn luyện

o Sơ đồ thuật toán huấn luyện n-gram

o Sơ đồ thuật toán huấn luyện mô hình n-gram chủ đề o Sơ đồ thuật toán huấn luyện cặp giá trị

o Sơ đồ thuật toán mở rộng từ tố liên quan o Sơ đồ thuật toán tính điểm liên quan

o Sơ đồ thuật toán kiểm tra sự phù hợp ngữ cảnh

o Sơ đồ thuật toán biến đổi từ dạng ngữ nghĩa sang từ vựng

3.3.1 Sơ đồ thuật toán ở mức tổng quan

Bắt đầu

Các file nguồn

Chuyển đổi sang cây cú pháp trừu tượng và

duyệt cây Trích xuất và lưu trữ

danh sách các

n-gram

- Huấn luyện n-gram chủ đề

- Huấn luyện cặp giá trị

Gợi ý mã

Kết thúc

Hình 3. 10. Sơ đồ thuật toán áp dụng SLAMC trong gợi ý mã cho ngôn ngữ C [8]

Hình 3.10 biểu diễn thuật toán áp dụng SLAMC trong gợi ý mã cho ngôn ngữ C. Đầu vào của chương trình là danh sách các tệp mã nguồn. Sau đó, chương trình sử dụng thư viện Eclipse CDT parser để chuyển đổi mã nguồn từ các tệp mã nguồn sang cây cú pháp trừu tượng và duyệt cây. Tiếp theo, chương trình trích xuất và lưu trữ

danh sách các n-gram. Sau khi đã có danh sách n-gram, chương trình thực hiện huấn luyện theo chủ đề và kết xuất các cặp giá trị có tần suất xuất hiện lớn. Cuối cùng, chương trình thực hiện tiến trình gợi ý mã nhằm đưa ra các từ tố phù hợp nhất với ngữ cảnh và phạm vi.

3.3.2 Sơ đồ thuật toán duyệt cây cú pháp trừu tượng

Bắt đầu

Cây cú pháp trừu tượng

Duyệt từng nút trên cây

Kết thúc Nút có vấn đề

Duyệt từng từ tố được lưu trữ bởi nút này. Kiểm tra loại của từ tố (kiểu dữ liệu, biến, …) để lưu trữ

Đúng

Trích xuất và lưu trữ các thông tin cần thiết như: kiểu

dữ liệu, tên biến, giá trị, ... Sai

Kiểm tra đã duyệt hết các nút hay chưa

Đúng Sai

Hình 3. 11. Sơ đồ thuật toán duyệt cây cú pháp trừu tượng

Hình 3.11 mô tả thuật toán duyệt cây cú pháp trừu tượng. Đầu vào của thuật toán là một cây cú pháp trừu tượng. Chương trình duyệt từng nút của cây theo thứ tự từ nút cha đến nút con. Đầu ra của thuật toán là tất cả các thông tin cần thiết như kiểu

dữ liệu, tên biến, … được sử dụng cho các tính toán tiếp theo (ví dụ: huấn luyện mô hình n-gram chủ đề, gợi ý mã, …).

3.3.3 Các sơ đồ thuật toán huấn luyện

3.3.3.1 Sơ đồ thuật toán huấn luyện n-gram

Bắt đầu - Tỷ lệ huấn luyện - Điểm bắt đầu - Danh sách tệp và các từ tố tương ứng - Danh sách tuần tự các từ tố - Giá trị tối đa n

- Tính và lưu trữ các file được huấn luyện - Lưu trữ các file sử dụng để kiểm thử Tính và lưu trữ danh sách các n-gram Kết thúc

Hình 3. 12. Sơ đồ thuật toán huấn luyện n-gram [8]

Hình 3.12 trình bày sơ đồ thuật toán huấn luyện n-gram. Đầu vào của thuật toán gồm có tỷ lệ huấn luyện, điểm bắt đầu huấn luyện, danh sách các tệp và từ tố tương ứng, danh sách tuần tự các từ tố, và giá trị tối đa n. Đầu tiên thuật toán tính và lưu trữ các tệp được sử dụng cho việc huấn luyện dựa vào tỷ lệ và điểm bắt đầu huấn luyện. Theo như đó, các tệp không nằm trong danh sách được huấn luyện sẽ thuộc danh sách tệp sử dụng cho việc kiểm thử. Sau đó, thuật toán tính và lưu trữ danh sách các n-gram tương ứng theo từng tệp. Các n-gram có kích cỡ tối đa là n.

3.3.3.2 Sơ đồ thuật toán huấn luyện n-gram chủ đề Bắt đầu Bắt đầu - Tập từ vựng n-gram - Các tham số làm mịn α, β - Số chủ đề K - Số vòng lặp Nt Tính và lưu trữ phân phối từ tố Tính và lưu trữ

Một phần của tài liệu (LUẬN văn THẠC sĩ) ứng dụng mô hình ngôn ngữ ngữ nghĩa thống kê trong gợi ý mã cho ngôn ngữ c (Trang 31)

Tải bản đầy đủ (PDF)

(61 trang)