Trong C, các nút lưu trữ thông tin khai báo toàn cục có thể bao gồm khai báo biến, struct, union và typedef, vì vậy khi duyệt qua các nút này chúng ta nên phân chia để duyệt từng loại nhằm tránh sự trùng lặp dữ liệu. Để hiểu rõ các thông tin cần lấy khi duyệt, chúng ta xem xét các ví dụ như dưới đây.
Ví dụ 1: Duyệt một khai báo biến đơn giản “int a = 0”. Duyệt khai báo biến này, chúng ta có thể lấy được các thông tin như kiểu dữ liệu int, tên biến a, phép gán “=”, và giá trị của biến a là 0. Sau khi lấy được các thông tin này, chúng ta có thể biểu diễn nghĩa vị của từng thông tin, cũng như lưu trữ vào một danh sách. Các nghĩa vị thu được là: TYPE[int], VAR[int, var], OP(ass_equal), LIT(int).
Ví dụ 2: Duyệt một định nghĩa struct
struct Books2 { char title[50]; char author[50]; char subject[100]; int book_id; } book;
Hình 3. 5. Định nghĩa struct trong C
Các thông tin có thể trích xuất khi duyệt qua một định nghĩa struct (hình 3.5) như từ khóa struct, tên struct (Books2), kiểu dữ liệu và tên các thuộc tính của struct (title, author, subject, book_id), và biến được khai báo book. Các nghĩa vị thu được là: STRUCT START,
TYPE(char), VAR(char [50], var), TYPE(char), VAR(char [50], var), TYPE(char), VAR(char [100], var), TYPE(int), VAR(int, var),
STRUCT END,
Trong một tệp mã nguồn C, chúng ta có thể định nghĩa nhiều struct, vì vậy để nâng cao khả năng gợi ý luận văn đã không biểu diễn và lưu trữ nghĩa vị của tên struct. Thay vào đó, các thông tin về struct (tên, các thuộc tính) sẽ được lưu trữ trong một lớp StructInfo. Mỗi một tệp mã nguồn nếu chứa các định nghĩa struct sẽ sử dụng một danh sách để lưu trữ các đối tượng của lớp StructInfo.
Ví dụ 3: Duyệt một định nghĩa union
union Data { int i; float f; char str[20]; } data;
Hình 3. 6. Định nghĩa union trong C
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.