1. Mục đích
Thành phần này làm nhiệm vụ phân tích một chương trình (mã nguồn java) thành một cây cú pháp trừu tượng AST. Cây AST này sẽđược sử dụng làm cơ sởđể so sánh cấu trúc giữa chương trình của sinh viên và chương trình mẫu.
2. Cài đặt
Để sinh ra được cây AST từ mã nguồn, ở luận văn này tôi sử dụng công cụ ANTLR. Các bước để thực hiện như sau:
- Bước 1: Cài đặt ANTLR và tích hợp nó với Netbean
- Bước 2: Xây dựng tệp tin ngữ pháp ASTDemo.g – đây là tệp tin xây dựng các quy tắc văn phạm để phân tích mã nguồn thành một cây AST.
- Bước 3: Sử dụng ANTLR để dịch tệp tin ASTDemo.g sinh ra 3 tệp tin ASTDemo.tokens, ASTDemoLexer.java và ASTDemoParser.java.
- Bước 4: Sử dụng 3 tệp tin ASTDemo.tokens, ASTDemoLexer.java và ASTDemoParser.java được sinh ra từ bước 3 và các thư viện của ANTLR để tạo nên cây AST từ mã nguồn.
Cụ thể từng bước được mô tả như sau:
Cài đặt ANTLR và tích hợp với Netbean
Ở bước này, tôi mặc định rằng máy tính đã được cài JDK và Netbean rồi. Để cài đặt ANTLR và sử dụng nó với Netbean ta làm theo các bước như sau:
- Download ANTLR phiên bản mới nhất tại http://www.antlr.org/. Ở luận văn này tôi sử dụng phiên bản 3.4
- Lưu tệp tin vừa tải về vào thư mục C:\Javalib - Thiết lập đường dẫn bằng dòng lệnh:
SET CLASSPATH=.;C:\Javalib\antlr-3.4-complete.jar;%CLASSPATH% - Kiểm tra xem cài đặt có thành công không bằng cách vào màn hình cmd gõ
lệnh:
Hình 5.1 Kết quả khi cài đặt ANTLR thành công
- Để project của bạn có thể sử dụng các thư viện ANTLR trong Netbean ta cần làm như sau: Tại project của bạn, kích chuột phải vào libraries trong cửa sổ project, sau đó chọn Add JAR/Folder… xuất hiện cửa sổ Add JAR/Folder ta tìm đến file antlr-
3.4-complete.jar trong C:/Javalib sau đó nhấn OK.
Xây dựng tệp tin ngữ pháp ASTDemo.g
Để tạo ra được cây AST từ mã nguồn sử dụng ANTLR ta phải xây dựng một quy tắc sinh trong tệp tin ngữ pháp có đuôi mở rộng là .g, ở đây tôi đặt tên tệp tin này là
ASTDemo.g.
Tệp tin ngữ pháp của ANTLR có quy tắc chung như sau:
Trong đó:
-grammar Name: grammar là từ khóa, Name là tên của tệp tin ngữ pháp, tệp tin ngữ pháp phải đặt là Name.g – ví dụ ở trong hệ thống thử nghiệm này dòng này là grammar ASTDemo tên của tệp tin ngữ pháp này là ASTDemo.g -Có thể có hoặc không các tùy chọn options, imports, and token. Tuy nhiên dòng
là phải có. Và phải có ít nhất một quy tắc. -Các quy tắc có dạng như sau:
Tên quy tắc (ruleName) phải được bắt đầu bằng một chữ cái thường.
-Tokens dùng để xác định các thẻ từ cần thiết (ở hệ thống này các thẻ là các nhãn node của cây AST). Cú pháp cơ bản là:
Các thẻ từ là các chữ in hoa. Ví dụ như hệ thống này là:
-@actionName có thể là: @header để chỉ ra tên của package của dự án. Một số quy tắc trong tệp tin ASTDemo.g của hệ thống thử nghiệm như sau:
@header { package programanalysisjava; } @lexer::header{ package programanalysisjava; } parse
: (declaration )+ -> ^(PROGRAM declaration +) // omit the semi- colon ; declaration :packageDeclaration |classDeclaration |importDeclaration ; packageDeclaration
; addPack :'package' qualifiedName ';' ; importDeclaration
: addImp -> ^(IMPORT addImp)
; addImp :'import' ('static' )? NAME '.' '*' ';' | 'import' ('static' )? NAME ('.' NAME )+ ('.' '*' )? ';' ; qualifiedName : NAME ('.' NAME )* ; classDeclaration
: addClass -> ^(CLASS addClass)
addClass
: modifiers 'class' NAME
block | 'class' NAME block ; block : '{' (statement )* '}' | statement ; statement : varDeclaration | asigment | methodCall | methodDeclaration | condition | loop ; //---varDeclaration--- varDeclaration
:addVar -> ^(VARDECLARATION addVar)
; addVar
: modifiers type NAME (',' NAME)* ';' | type NAME (',' NAME)* ';' ;
type : 'boolean' | 'char' | 'byte' | 'short' | 'int' | 'long' | 'float' | 'double' | 'void' ; ………
Dùng ANTLR dịch tệp tin ASTDemo.g
Để có thể sử dụng được tệp tin ASTDemo.g ta cần dùng ANTLR dich nó ra thành 3 tệp tin ASTDemo.tokens, ASTDemoLexer.java và ASTDemoParser.java. Để làm điều này, ta vào cửa sổ cmd gõ vào dòng lệnh sau:
Kết quả trong thư mục C (thư mục chứa tệp tin ASTDemo.g) xuất hiện thêm 3 tệp tin: ASTDemo.tokens, ASTDemoLexer.java và ASTDemoParser.java
Tạo AST từ mã nguồn
Input: tệp tin mã nguồn Java Output: Cây AST
Ở đây ta sử dụng các thư viện của ANTLR và các tệp tin có được sau khi dịch tệp tin ASTDemo.g.
Cây AST sau khi sinh ra được lưu trong file XML. Ở hệ thống này tôi chỉ so sánh về mặt cấu trúc nên tôi chỉ cần lấy ra cấu trúc của cây AST về các loại lệnh: lệnh gán, khai báo phương thức, gọi phương thức, vòng lặp, điều kiện,…