2015-01-07 16 views
5

Tôi đã triển khai chương trình TreeScanner, để in thông tin về tất cả các nút trong AST. Chương trình hỗ trợ tất cả các loại (tất cả các phương thức truy cập được thực hiện). Tuy nhiên, vấn đề là đối với tuyên bố, System.out.println(object.YYY); chương trình không truy cập tham chiếu trường YYY.Cách cây cú pháp in bằng cách sử dụng Javac

Phát hiện đối tượng làm số nhận dạng nhưng không thể phát hiện YYY làm số nhận dạng. Tuy nhiên, khi tôi có System.out.println (YYY); sau đó visitIdentifier sẽ truy cập YYY.

Vui lòng cho tôi biết sự khác nhau giữa hai dòng trên là gì, trong khi trong một YYY được truy cập bởi bộ định danh, trong trường hợp khác, nó không được truy cập.

Tôi làm cách nào để truy cập YYY trong đối tượng .YYY?

Trong lớp org.eclipse.jdt.core.dom chúng tôi có FieldAccess được gọi trong cả hai trường hợp trên cho YYY, nhưng dường như TreeScanner ở Javac không có phương pháp tương tự.

+2

Nó có thể giúp đỡ để gửi một số mã ... – tddmonkey

+0

là 'YYY' một' final' tĩnh (ví dụ: không đổi) lĩnh vực? –

+0

Tôi đã kiểm tra tất cả các trường hợp sau: trường tĩnh, tĩnh cuối cùng và bình thường. Trong cả ba trường hợp, nó không thể phát hiện YYY là số nhận dạng. –

Trả lời

1

Phương thức visitIdentifier được gọi trên ghi chú Định danh trong AST, được tạo khi định danh được sử dụng làm biểu thức. Tuy nhiên, cú pháp để lựa chọn thành viên trong Java là <expression>.<identifier>, không phải là <expression>.<expression>, có nghĩa là YYY trong object.YYY không phải là biểu thức con và do đó không có subtree riêng. Thay vào đó, MemberSelectTree cho object.YYY chỉ cần chứa YYY trực tiếp là Name, có thể truy cập qua getIdentifier(). Không có phương pháp visitName trong TreeScanner, do đó, cách duy nhất để lấy số YYY ở đây sẽ là thực hiện điều này từ số visitMemberSelect trực tiếp.

Đây là cách bạn muốn in object.YYY sử dụng visitMemberSelect:

Void visitMemberSelect(MemberSelectTree memberSelect, Void p) { 
    // Print the object 
    memberSelect.getExpression().accept(this, p); 
    System.out.print("."); 
    // Print the name of the member 
    System.out.print(memberSelect.getIdentifier()); 
} 
+0

Cảm ơn. Chấp nhận làm câu trả lời đúng. –

Các vấn đề liên quan