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

Một phần của tài liệu Ứ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 28)

Cây cú pháp trừu tượng là một cây có giới hạn, có nhãn và có hướng. Đây là cấu trúc cây mà các nút gốc của cây được gán nhãn bằng các toán tử và các nút lá của cây là các toán hạng. Tuy vậy, các lá cũng có khi là các giá trị NULL hoặc là các biến. Trong các công đoạn của chương trình dịch, cây AST được dùng trong bộ phân tích cú pháp như là một trung gian giữa cây phân tích cú pháp và cấu trúc dữ liệu [6].

Cài đặt SLAMC cho C, chúng ta có thể sử dụng một số công cụ giúp cho việc

chuyển đổi mã nguồn sang cây cú pháp trừu tượng như Clang, và Eclipse CDT parser. Clang là một lựa chọn tốt bởi vì công cụ này có tài liệu mô tả tốt hơn Eclipse CDT parser, nhưng Clang được viết trong C++ [3]. Ngôn ngữ xây dựng chương trình mô phỏng là Java, vì vậy luận văn đã lựa chọn áp dụng Eclipse CDT parser để chuyển đổi mã nguồn C sang cây cú pháp trừu tượng.

Để sử dụng Eclipse CDT parser, chúng ta phải tải về một gói jar có tên là “org.eclipse.cdt.core_5.3.1.201109151620.jar” và thêm vào chương trình như một thư viện của Java. Hình 3.2 chỉ ra danh sách các lớp cần thiết để thực thi chuyển đổi mã nguồn C sang cây cú pháp trừu tượng. Hình 3.3 đưa ra các bước để gọi Eclipse CDT parser. Hình 3.4 trình bày một ví dụ chuyển đổi mã nguồn C sang cây cú pháp trừu tượng. import java.util.*; import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.parser.*;

Hình 3. 2. Danh sách cần import để gọi CDT parser [3]

Hình 3.2 trình bày danh sách các lớp cần import để thực hiện chương trình. Nhiều lớp được sử dụng, nhưng lớp GCCLanguage là lớp được quan tâm nhất bởi vì lớp này trực tiếp thực hiện việc chuyển đổi mã nguồn C sang cây cú pháp trừu tượng.

private static IASTTranslationUnit parse(char[] code) throws Exception { FileContent fc = FileContent.create("", code);

Map<String, String> macroDefinitions = new HashMap<String, String>(); String[] includeSearchPaths = new String[0];

IScannerInfo si = new ScannerInfo(macroDefinitions, includeSearchPaths); IncludeFileContentProvider ifcp = IncludeFileContentProvider

.getEmptyFilesProvider(); IIndex idx = null;

int options = ILanguage.OPTION_IS_SOURCE_UNIT; IParserLogService log = new DefaultLogService();

return GCCLanguage.getDefault().getASTTranslationUnit(fc, si, ifcp, idx, options, log);

}

Hình 3. 3. Gọi Eclipse CDT parser [3]

public static void main(String[] args) throws Exception { String code = "void testBooks(int c, char b){}";

IASTTranslationUnit translationUnit = parse(code.toCharArray()); ASTVisitor visitor = new ASTVisitor() {

@Override

public int visit(IASTName name) {

System.out.print(name.toString() + " "); return ASTVisitor.PROCESS_CONTINUE; } }; visitor.shouldVisitNames = true; translationUnit.accept(visitor); }

Hình 3. 4. Chuyển đổi đoạn mã “void testBooks(int c, char b){}”

CDT parser trả về một cây cú pháp trừu tượng như là kết quả của việc chuyển đổi mã nguồn. Cây AST này bao gồm nhiều nút. Mỗi nút tương ứng với một cú pháp của mã. Ví dụ: định nghĩa một hàm, một phát biểu if, một vòng lặp for, hoặc một biến.

Một phần của tài liệu Ứ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 28)

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

(61 trang)