2013-03-06 20 views
8

Trong trường hợp sử dụng của tôi, tôi phải phân tích vài nghìn biểu thức nhỏ và độc lập thành biểu diễn cây bằng cách sử dụng Khách truy cập trên cây phân tích được tạo. Hiện tại các trường hợp luồng, lexer và phân tích cú pháp mới được tạo cho từng hoạt động phân tích cú pháp.sử dụng lại trình phân tích cú pháp antlr4 và làm ấm

Tôi cho rằng điều này có thể không tối ưu. Các thể hiện đối tượng nào có thể được tái sử dụng trong một thiết lập như vậy để sử dụng thuộc tính khởi động của ANTLR4? Làm thế nào về an toàn thread - trong đó những trường hợp nên được thread địa phương? Là một thiết lập lại của một số loại cần thiết để tái sử dụng một trường hợp lexer hoặc phân tích cú pháp?

Trả lời

11

Trong những ngày đầu của ANTLR 4 (nhiều tháng trước khi phát hành ban đầu), bộ nhớ cache DFA thích ứng được tạo trên cơ sở từng trường hợp, do đó việc sử dụng Lexer.setInputStream hoặc Parser.setInputStream là điều cần thiết để đạt được hiệu suất tốt.

Điều này không còn xảy ra. Bộ nhớ cache nền hiện được chia sẻ giữa tất cả các trường hợp trình phân tích cú pháp và là luồng an toàn. Các phương thức của các lớp LexerParser không phải là chủ đề an toàn, vì vậy nếu bạn muốn phân tích cú pháp trên nhiều luồng, bạn sẽ cần phải tạo nhiều phiên bản của trình thu thập dữ liệu và trình phân tích cú pháp của mình.

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