2013-02-08 19 views
28

Tôi cần trợ giúp với ngữ pháp ANTLR 4 sau khi quyết định chuyển sang v4 từ v3. Tôi không phải là rất có kinh nghiệm với ANTLR vì vậy tôi thực sự xin lỗi nếu câu hỏi của tôi là câm;)

Trong v3 tôi đã sử dụng đoạn mã sau để phát hiện Java kiểu nhận xét:

COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    | '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

Trong v4 không có quy tắc tùy chọn cụ thể. Các hành động (di chuyển đến kênh ẩn) cũng không hợp lệ.

Có thể ai đó vui lòng cho tôi gợi ý cách thực hiện trong ANTLR v4?

Trả lời

33

Các v4 tương đương sẽ trông như thế:

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/' 
     ) -> channel(HIDDEN) 
    ; 

mà sẽ đặt tất cả các dòng chú thích đơn và đa trên kênh HIDDEN. Tuy nhiên, nếu bạn không làm bất cứ điều gì với những HIDDEN -tokens, bạn cũng có thể skip những thẻ, trong đó sẽ trông như thế này:

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/' 
     ) -> skip 
    ; 

Lưu ý rằng để nói với lexer hoặc phân tích cú pháp để phù hợp với ungreedy, bạn don' t sử dụng options {greedy=false;} nữa, nhưng nối thêm ?, tương tự như nhiều triển khai regex.

+0

Cảm ơn bạn rất nhiều! – user2055330

+0

Hiện tại, tôi sử dụng mã được đề xuất của bạn (biến thể đầu tiên sử dụng kênh) sẽ phát ra lỗi: '-> lệnh trong quy tắc lexer 'COMMENT' phải là phần tử cuối cùng của một điểm ngoài cùng duy nhất 'Có vấn đề gì? – user2055330

+0

@ user2055330, hãy thử phiên bản đã chỉnh sửa của tôi. –

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