2012-04-30 18 views
5

Chúng tôi có những điều sau phụ một phần của ngữ pháp ANTLR:Xử lý lỗi ANTLR Cú pháp hoặc làm thế nào để đưa ra một thông điệp tốt hơn trên bất ngờ thẻ

signed_int 
     : SIGN? INT 
    ; 

INT : '0'..'9'+ 
     ; 

Khi ai đó bước vào một giá trị số tất cả mọi thứ là tốt, nhưng nếu họ nhầm gõ cái gì đó như 1o (một và o vốn), chúng tôi nhận được một thông báo lỗi khó hiểu như:

error 1 : Missing token at offset 14 
near [Index: 0 (Start: 0-Stop: 0) ='<missing COLON>'  type<24> Line: 26 LinePos:14] 
: syntax error... 

một cách tốt để xử lý loại hình này lỗi là gì? Tôi đã nghĩ đến việc xác định loại mã thông báo SYMBOL bắt giữ nhưng điều này dẫn đến quá nhiều lỗi xây dựng phân tích cú pháp . Tôi sẽ tiếp tục xem xét xử lý lỗi Antlr nhưng tôi nghĩ rằng tôi sẽ đăng bài này ở đây để tìm kiếm một số thông tin chi tiết.

Trả lời

4

Bạn nên ghi đè báo cáoPhương pháp lỗi trong lexer và phân tích cú pháp. Bạn có thể làm điều đó bằng cách thêm mã này vào tập tin lexer của bạn:

@Override 
public void reportError(RecognitionException e) { 
    throw new RuntimeException(e); 
} 

Và tạo ra một phương pháp phù hợp trong phân tích cú pháp để kiểm tra nếu chuỗi đầu vào phù hợp với ngữ pháp đã chỉ định:

public static boolean matches(String input) { 
    try { 
     regExLexer lexer = new regExLexer(new ANTLRStringStream(input)); 
     regExParser parser = new regExParser(new CommonTokenStream(lexer)); 
     parser.goal(); 
     return true; 
    } catch (RuntimeException e) { 
     return false; 
    } 
    catch (Exception e) { 
     return false; 
    } 
    catch (OutOfMemoryError e) { 
     return false; 
    } 

} 

@Override 
public void reportError(RecognitionException e) { 
    throw new RuntimeException(e); 
} 

Sau đó sử dụng tập tin của bạn các Parser.matches (đầu vào); để kiểm tra xem đầu vào đã cho có khớp với ngữ pháp hay không. Nếu nó khớp với phương thức trả về true, ngược lại trả về false, vì vậy khi nó trả về false bạn có thể đưa ra bất kỳ thông báo lỗi tùy chỉnh nào cho người dùng.

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