2013-02-01 15 views
6

Tôi đang sử dụng javac từ tools.jar (ví dụ: JavaCompiler) để phân tích cú pháp các tệp java. Tôi phân tích các nguồn bằng cách thực hiện TreePathScanner. Cho đến nay, mọi thứ có vẻ ổn, vì tôi có thể phân tích cú pháp nhập, tên gói, tên lớp, tên phương thức, hướng dẫn ...Cách đọc nhận xét nội tuyến từ tệp java bằng cách sử dụng trình phân tích cú pháp công cụ javac?

Nhưng tôi có vấn đề với inline ý kiến ​​- Tôi không thể đơn giản làm cho chúng xuất hiện trong tạo cây AST hoặc truy cập chúng. Tuy nhiên, tôi có thể đọc nhận xét javadoc cho các lớp, phương pháp, v.v. nhưng không có nhận xét nội tuyến.

Cách đọc nhận xét nội tuyến theo cách tốt nhất? Tôi đang nhìn vào mã nguồn netbeans (vì nó đang sử dụng javac để phân tích cú pháp, quá), nhưng tôi không thể tìm thấy một cách dễ dàng bất cứ điều gì về nó.

Giải pháp tuyệt vọng của tôi sẽ sử dụng vị trí câu lệnh của tệp nguồn và sau đó phân tích cú pháp theo cách thủ công để nhận xét mọi thứ giữa hai câu lệnh. Hoặc điều tương tự, nhưng giữa hai nút cây.

Có ai biết giải pháp tốt hơn không? Cảm ơn bạn!

+0

Tôi thấy rằng com.sun.tools.javac.main.JavaCompiler có một số cờ keepComments được đặt thành false theo mặc định. Đó là những gì bạn đang cố gắng sử dụng? Bạn đã thử thay đổi nó? – jdb

+0

vâng, tôi đã có cài đặt này thành true, không nhận thấy bất kỳ sự khác biệt nào. – igr

Trả lời

4

Bạn không thể. Trình biên dịch ném chúng đi. Trình biên dịch luôn làm điều đó. Trình biên dịch Java không vứt bỏ các chú thích Javadoc chỉ vì Javadoc sử dụng trình biên dịch để tìm chúng và các kẻ Javadoc đã kết hợp với các trình biên dịch.

+0

Điều này đúng. Tôi đã kiểm tra nguồn cho javac và trong lớp 'Máy quét' bạn có thể thấy phương pháp sau:' bảo vệ quá trình void void (CommentStyle style) 'mà chỉ cần đăng nhập thông báo gỡ lỗi. Tôi sẽ cố gắng xem liệu tôi có thể ghi đè nó hay không. – igr

+0

Tôi đã quản lý để chạy trình phân tích cú pháp không sử dụng ** JavaCompiler **, nhưng chỉ các lớp ** Trình quét ** và ** Phân tích cú pháp **; và có thể ghi đè lên phương thức 'CommentComment', nhưng ...phương pháp này chỉ cung cấp cho các thông tin rằng bình luận đã được xử lý và bình luận loại và không có gì nhiều hơn (như giá trị, vị trí vv). – igr

+0

btw, có vẻ như trình biên dịch AST eclipse giữ lại các bình luận. – igr

1

Sự khác biệt chính giữa "trình phân tích cú pháp trình biên dịch" và "trình phân tích cú pháp lại" phải thực hiện với thông tin nào được chụp về bố cục, nhận xét và định dạng của chữ. Như những người khác đã quan sát thấy, hầu hết các trình biên dịch ném tất cả thông tin này đi, vì nó không phải là germane để biên dịch xuống mã cấp thấp.

Tương tự, trình tạo trình phân tích cú pháp cổ điển (như JavaCC, ANTLR, v.v.) cung cấp rất ít hỗ trợ thu thập/tái tạo thông tin này.

Trình phân tích cú pháp lại được sử dụng để phân tích mã nhận xét, đôi khi thậm chí sửa đổi mã mà không bị mất (hoặc sửa đổi thích hợp nhận xét). Để phân tích mã với các chú thích, bạn không thể vứt bỏ các chú thích: -} Để sửa đổi mã, nếu bạn tạo lại mã đã thay đổi dựa trên bản gốc, nó sẽ tốt đẹp nếu mã đã thay đổi bảo toàn bố cục mã, chú thích và "định dạng" theo nghĩa đen (ví dụ , regnerating một hex literal như là một giá trị thập phân là hợp pháp và tương đương, nhưng làm cho các tác giả ban đầu khá không hài lòng). Để thực hiện điều này, các trình phân tích cú pháp lại cần các từ vựng đặc biệt để nắm bắt tất cả dữ liệu này và phân tích cú pháp các máy móc không vứt bỏ nó.

Bộ công cụ quản lý lại phần mềm DMS của chúng tôi bao gồm, tốt, một trình phân tích cú pháp tái tổ chức làm máy móc chung; Các trình phân tích cú pháp dựa trên DMS tồn tại cho nhiều ngôn ngữ (bao gồm cả sự quan tâm của OP trong Java). DMS nắm bắt tất cả các thông tin nhận xét/bố cục/định dạng. Công cụ phân tích có quyền truy cập vào tất cả.

TXL và Stratego cũng cung cấp một số hỗ trợ cho điều này.